當前位置:首頁 » 資源管理 » 安卓如何適配資源文件
擴展閱讀
哪個國家鑽石回收價格高 2025-05-25 22:23:45
哪裡有賣磨電鋸工具 2025-05-25 22:15:23

安卓如何適配資源文件

發布時間: 2022-07-13 10:58:07

Ⅰ 怎麼樣讓Android實現全屏幕適配

一、關於布局適配

1、不要使用絕對布局

2、盡量使用match_parent 而不是fill_parent 。

3、能夠使用權重的地方盡量使用權重(android:layout_weight)

4、如果是純色背景,盡量使用android的shape 自定義。

5、如果需要在特定解析度下適配,可以在res目錄上新建layout-HxW.xml的文件夾。比如要適配1080*1800的屏幕(魅族MX3採用此解析度)則新建layout-1800x1080.xml的文件夾,然後在下面定義布局。Android系統會優先查找解析度相同的布局,如果不存在則換使用默認的layout下的布局。

二、關於圖片製作

1、關於設計:

設計圖先定下一個要設計的尺寸,而且盡量採用在目前最流行的屏幕尺寸(比如目前占屏幕比重比較多的是480系列,也即是480*800或者400*854,下面的圖標製作也在次基礎上進行比例的換算)上設計。

先了解一下屏幕的級別:

屏幕級別:

注意屏幕級別是按照密度分級,和像素沒有關系。如果非要讓密度和像素扯上關系,則需要一個參照系,android使用mdpi級別作為標准參照屏幕,也就是說在320*480解析度的手機上一個密度可以容納一個像素。然後其他密度級別則在此基礎上進行對比。如果理想情況下,480*800的屏幕一個密度可以容納1.5個像素。

物理大小:

單位是英寸而不是像素,也就說一個英寸在任何解析度下顯示的大小都是一樣的,但是像素在密度不同的手機裡面顯示的實際的大小是不一樣的(這就是為什麼android手機需要適配的原因)。

然後就是重點。

假設1像素在160密度下顯示1英寸,則1像素在240密度基礎上顯示大約0.67英寸,在320密度下顯示0.5英寸。於是就出現一種情況,在電腦上的一個像素,在不同的手機上看實際的大小不一樣。那麼怎麼讓「設計效果」在不同的手機上看起來顯示的區域一樣呢?

還是假設一個像素在160密度下的顯示在一個密度內,也假設就是一英寸。那麼需要幾個像素才能在240密度級別下顯示在一英寸范圍內呢?答案是1.5個像素(根據上圖的比率換算)。

了解了這個關系,接下來就是圖標的製作。

2、關於切圖。

關於切圖有幾個建議:

第一,長寬最好是3的倍數(根據android的推薦logo圖標的大小是48(mdpi),72(hdpi),96(xhdpi)得出的最小公約數)。

第二,長寬最好是偶數。因為奇數在進行等比壓縮的時候可能有問題。

第三,根據上面兩條,如果長寬是6的倍數最理想。

第四,如果可以拉伸而不改變設計意圖的情況下,比如純色背景,則使用android的9path工具製作成.9的圖片。

3、關於圖標的適配。

然後接下來的一切就和設計稿沒什麼關系。在切好圖的基礎上,根據屏幕密度、像素和實際大小的比例關系。假如設計司在480*800的解析度下做好了設計圖,並且切好圖,如果你需要適配720*1280屏幕,該怎麼做?根據比例,他們的關系是2:3,於是你需要按照1.5倍比例製作圖標,比如你在480*800的設計稿上切下來一個20*20像素的圖,那麼你就需要製作一個等比放大成30*30像素的圖標,這樣同一個圖標在480*800的屏幕和720*1280的屏幕上顯示的實際大小才一樣。同理,如果你需要適配xxhdpi則需要在20*20的基礎上製作一個等比放大成40*40像素的圖標。

4、關於圖標的目錄,480*800切下來的圖我們放在drawable-hdpi目錄下,按照2:3放大的圖標放在drawable-xhdpi目錄下,按照2倍放大的圖標放在drawable-xxhdpi目錄下。

android會根據手機的密度優先查找對應的目錄的資源,

比如408*800解析度下的手機如果密度是160,則自動載入drawable-hdpi這個目錄下的圖標,

如果720*1280密度是240的手機自動載入drawable-xhdpi這個目錄下的圖標。如果沒有這個文件夾,則查找和240最接近的對應密度文件夾。

三、其它

接下來要說的估計會讓你失望,根據上面的步驟也不能完全解決適配的問題,只能是大概適配,而就算根據上面的步驟大概適配了,實際在手機上的效果也有出入。

比如魅族MX3的解析度是1080*1800,標准情況下密度是480,但是他的密度大約是524,和480接近,也就是會查找drawable-xxhdpi這個資源下的文件。也就是說你在480*800解析度下切圖然後按兩倍放大的圖標在這台手機上顯示的效果還是比實際的小。

而另一個要說的問題是540*960或者640*960,他們的密度很可能是或者接近240也可能是320。於是在480*800的設計稿上切下來的圖並且進行的適配製作,在這些手機上顯示的實際大小也可能或大或小。

Ⅱ 怎麼給APP適配高版本的安卓系統

Android的最新版本會提供一些很棒的API,您的APP使用新版本API的同時也要兼容舊的Android版本,直到更多設備已更新到新版本的APP。本文檔將向您展示如何利用最新的API,同時繼續支持舊版本。

根據對訪問Google Play商店的設備數量的統計,平台版本分布表會進行定期更新,以顯示運行每個版本的Android設備的分布情況。一般來說,一個APP最好能支持大約90%的活動設備,同時使用最新的Android版本。

提示:為了在多個Android版本中提供最佳特性和功能,您應該在APP中使用Android Support Library,這樣可以在舊版本上使用幾種最新的平台API。

指定Minimum和Target API Levels

AndroidManifest.xml文件描述APP的詳細信息,並標識其支持的Android版本。具體來說,<uses-sdk>元素的minSdkVersion和targetSdkVersion屬性標識了APP兼容的最低和最高API級別。
隨著新版Android的發布,一些風格和行為可能會有所改變。為了讓您的應用程序能夠利用這些更改,並確保您的應用程序適合每個用戶設備的風格,您應該把targetSdkVersion的值設置為最新的Android版本。

在運行時檢查系統版本

Android在Build常量類中為每個平台版本提供了一個唯一的編碼。APP用這個編碼來確保只有系統支持高版本API時,才會執行依賴高版本API的代碼。
注意:解析XML資源時,Android會忽略當前設備不支持的XML屬性。因此,您可以安全地使用僅由較新版本支持的XML屬性,而不必擔心舊版本遇到該代碼時出錯。例如,如果您設置targetSdkVersion =「11」,則APP在Android 3.0及更高版本上默認包含ActionBar。如果要將menu項添加到action bar,您需要在menu資源XML中設置android:showAsAction =「ifRoom」。 在跨版本的XML文件中可以安全地執行此操作,因為較舊版本的Android只會忽略showAsAction屬性(即,不需要在res / menu-v11 /中添加一個單獨的menu資源)。

Ⅲ Cocos2D 如何做 Android 適配

我們知道Cocos2D 是跨平台的 ( Android, iOS, BlackBerry ), 因此它必須把自己適配到不同平台上, 這些適配包括:1) 屏幕顯示2) 用戶輸入3) 進程主循環4) 資源文件 (圖片,音樂)資源適配Android 的程序是 Apk, Apk 也是一個 Zip 文件. 處理資源文件有下列幾步1) Cocos2dxHelper 初始化時會吧 Java 層的 ApkPath 傳遞到 native 層2) native 成的 CCFileUtils 在用 shareFileUtils() 初始化時, 會新建自己的派生類 CCFileUtilsAndroid, 並把 apk 解開到臨時目錄.程序運行中要load資源文件的時候, 就到臨時目錄去找3) 在程序退出時, 這個臨時目錄會被刪除補充:( 實際上 shareFileUtils() 就在CCFileUtilsAndroid.cpp中實現, build iOS 版本不會包含它, 而是在CCFileUtilsiOS.cpp 中吧 ) Java 層適配類Cocos2dx 提供了幾個Java 層的適配類, 它們在 Cocos2dxActivity 的onCreate 被初始化. 1) 上面我們提到Cocos2dxHelper, 可以看它的 init 被調用2) Cocos2dxGLSurfaceView 派生於 GLSurfaceView, 這樣就可以直接調用 opengl的函數繪圖, 並在此View 中顯示了3) 主要的邏輯都在Cocos2dxRenderer中完成, 最重要的就是它 Cocos2dxRenderer 1) onSurfaceCreated 的 nativeInit 被調用, Cocos2d 所有重要對象( CCDirector, CCSence, HelloWorld 等) 都是這里初始化的2) onDrawFrame 的時候, 就是通知Cocos2d繪制一幀, 詳細內容可以參考 理解Cocos2D 如何繪制幀 另外還有輸入的處理,也是通過Cocos2dxRenderer 從 Android的java層 傳遞到了 Cocos2d的 native 層 nativeInit下面這張圖,描述了 Cocos2D 的對象是如何初始化的 onSurfaceCreated 的 nativeInit 被調用, 也就是說: "可以用opengl 繪圖了, Cocos2d 你初始化吧"Cocos2d 做了下面的工作1) 根據 Android 提供屏幕大小信息設置 FrameSize2) 新建 AppDelegate, 注意 AppDelegate 是 CCApplication 的派生類, 當AppDelegate 的run 被調用, 它會調用到) 在applicationDidFinishLaunching 中, Director, Scene 都被創建,4) 最後讓 Director 運行 Scence通過以上這些 Cocos2D 就被適配 Android 系統中了。

Ⅳ Android 開發中 如何做到XML多屏幕適配

Android上面解決適配不同尺寸(解析度)和密度的問題,主要是通過以密度分類,再加上解析度的方式來減化適配不同尺寸屏幕的工作量.
一般來講,屏幕解析度越高,清晰度也應該越高,也即其密度也應該越大,否則會看起來很不清楚,比如4寸的屏幕只顯示100個像素,這就近距離看電影,或者看投影儀一樣,非常的粗糙和不清晰.所以,Android主要是以屏幕密度來區分不同的設備:
高密度: hdpi (High dots per inch)
中等密度: mdpi (Medium dots per inch)
低密度: ldpi (Low dots per inch)
並且布局中推薦使用密度無關單位dip或dp,來作為長度或者寬度的單位.這樣,從理論上來講,開發者只需要做:
1. 為不同的密度屏幕准備圖片資源
(圖片是沒辦法的,因為圖片的長度和寬度是固定的像素值,不能夠隨密度變化而變化,可以強行拉伸,但圖片會失真.當然也有9 Patch圖片可以解決隨意拉伸的問題.但普通的圖片的長度和寬度是固定的.
2. 用dip作為單位來指定長度或者寬度
就可以適配所有的設備,讓布局在所有的屏幕上都得到比較好的顯示效果.
當然,現實的生活沒有這么完美,各種設備千差萬別.但是總體仍可分為這三大類,為這三大類准備好圖片後,其他的只要與某一類較接近,即使稍有拉伸或失真,也不太明顯,是可以接受的.所以,對於一般性的應用程序,寫一個布局文件在layout中,為三種密度准備圖片drawable-hdpi, drawable-mdpi, drawable-ldpi,就足以應對80%的設備.
res/
drawable-hdpi/
ic_launcher.png
drawable-mdpi/
ic_launcher.png
drawable-ldpi/
ic_launcher.png
layout/
main.xml
(這里可能有點過時了,因為現在多了xdpi,而且很多設備也是xdpi的.)
但是光以密度屏幕來分類和處理還不夠.隨著設備的越來越多,以及屏幕尺寸越來越大,還有就是Tablet的出現,又會出現這樣的問題:設備的屏幕密度雖然不高,但其解析度很高.舉個簡單的例子:iPad2的解析度是1024x768,iPhone 4 960x640,但是iPhone 4的密度是326ppi,遠大於iPad2.但是,無論密度有多高它的屏幕就那麼,最多能顯示960x640個像素點,一個1024*768的圖片在iPad上可以看到全部,而iPhone上只能看到一大半!這也是為什麼用iPad來運行iPhone上的應用程序時,只是以屏幕中間的一部分來模擬顯示的原因.
對Android來說也是一樣的.如此一來,即使相同的dpi,假如其屏幕尺寸非常大,那麼為其准備的圖片將被拉伸很大或者顯示不全.UI元素也會被拉伸很長.這樣並不是很好的體驗.對於尺寸大的屏幕應該讓其顯示更多的內容,而不是把一部分元素拉伸很大.所以,很多手機安卓應用如果未經專門適配,在平板上直接使用體驗將會是非常差的.
為了解決這樣的問題,就還必須以屏幕尺寸來區分設備
主要有四種屏幕尺寸:small, normal, large and xlarge
這主要是配合屏幕密度來一起使用,比如,適配平板的圖片:
drawable-xlarge-hdpi/ic_launcher.png
這里就要提到了密度,尺寸和解析度的對應關系了. 屏幕解析度是隨設備變化最明顯的一個,上面的二種分類方法僅是對屏幕進行的大致的一個分類.雖然屏幕解析度與密度沒有直接的關系,但是所有的設備都基本上一致的:
ldpi QVGA 240*320 0.8
mdpi HVGA 320*480 1.0
hdpi WVGA 480*800 1.5
hdpi qHD 540*960 1.5
xdpi WXGA 720*1280 2

Ⅳ 安卓app設計屏幕解析度適配問題怎麼解決

想要Android應用適應不同尺寸的屏幕,思路如下:

  • 不同的layout
    Android手機屏幕大小不一,有480x320, 640x360, 800x480,讓app適應不同屏幕,需要在res目錄下創建不同的layout文件夾,比如layout-640x360,layout-800x480,所有的layout文件在編譯之後都會寫入R.java里,而系統會根據屏幕的大小自己選擇合適的layout進行使用。

  • hdpi、mdpi、ldpi
    在之前的版本中,只有一個drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三個,這三個主要是為了支持多解析度。

  • drawable- hdpi、drawable- mdpi、drawable-ldpi的區別:
    (1)drawable-hdpi裡面存放高解析度的圖片,如WVGA (480x800),FWVGA (480x854)
    (2)drawable-mdpi裡面存放中等解析度的圖片,如HVGA (320x480)
    (3)drawable-ldpi裡面存放低解析度的圖片,如QVGA (240x320)
    系統會根據機器的解析度來分別到這幾個文件夾裡面去找對應的圖片。
    更正:應該是對應不同density 的圖片
    在開發程序時為了兼容不同平台不同屏幕,建議各自文件夾根據需求均存放不同版本圖片。
    屏幕方向:
    橫屏豎屏自動切換:
    可以在res目錄下建立layout-port-800x600和layout-land兩個目錄,裡面分別放置豎屏和橫屏兩種布局文件,這樣在手機屏幕方向變化的時候系統會自動調用相應的布局文件,避免一種布局文件無法滿足兩種屏幕顯示的問題。

  • 不同解析度橫屏豎屏自動切換:
    以800x600為例 :
    可以在res目錄下建立layout-port-800x600和layout-land-800x600兩個目錄
    不切換:
    以下步驟是網上流傳的,不過我自己之前是通過圖形化界面實現這個配置,算是殊途同歸,有空我會把圖片貼上來。
    還要說明一點:每個activity都有這個屬性screenOrientation,每個activity都需要設置,可以設置為豎屏(portrait),也可以設置為無重力感應(nosensor)。

  • 要讓程序界面保持一個方向,不隨手機方向轉動而變化的處理辦法:
    在AndroidManifest.xml裡面配置一下就可以了。

  • 加入這一行android:screenOrientation="landscape"。
    例如(landscape是橫向,portrait是縱向):

  • 以下是JAVA代碼:

<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.ray.linkit"
android:versionCode="1"
android:versionName="1.0">
<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
<activityandroid:name=".Main"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activityandroid:name=".GamePlay"
android:screenOrientation="portrait"></activity>
<activityandroid:name=".OptionView"
android:screenOrientation="portrait"></activity>
</application>
<uses-sdkandroid:minSdkVersion="3"/>
</manifest>
  • 另外,android中每次屏幕的切換動會重啟Activity,所以應該在Activity銷毀前保存當前活動的狀態,在Activity再次Create的時候載入配置,那樣,進行中的游戲就不會自動重啟了!

  • 有的程序適合從豎屏切換到橫屏,或者反過來,這個時候怎麼辦呢?可以在配置Activity的地方進行如下的配置android:screenOrientation="portrait"。這樣就可以保證是豎屏總是豎屏了,或者landscape橫向。

  • 而有的程序是適合橫豎屏切換的。如何處理呢?首先要在配置Activity的時候進行如下的配置:android:configChanges="keyboardHidden|orientation",另外需要重寫Activity的 onConfigurationChanged方法。實現方式如下,不需要做太多的內容:

  • @Override
    (ConfigurationnewConfig){
    super.onConfigurationChanged(newConfig);
    if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE){
    //landdonothingisok
    }elseif(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT){
    //portdonothingisok
    }
    }
  • 寫一個支持多分辨的程序,基於1.6開發的,建立了三個資源文件夾drawable-hdpi drawable-mdpi drawable-ldpi,裡面分別存放72*72 48*48 36*36的icon圖標文件。當我在G1(1.5的系統)上測試時,圖標應該自適應為48*48才對啊,但實際顯示的是36*36。怎麼才能讓其自適應 48*48的icon圖標呢 ?
    解決辦法 drawable-hdpi drawable-mdpi drawable-ldpi改成drawable-480X320 drawable-800X480的多分辨支持的文件夾。

Ⅵ 詳解Android系統如何找到最匹配的資源文件的

當我們將一些提供了不同的資源文件可供Android系統選擇的時候,Android會在運行時會根據一套適配的規則選擇最符合當前配置的資源。為了說明Android怎麼選擇資源,假設我們有以下可選的資源文件目錄,每一個目錄都包含同一張圖片的不同版本。

Ⅶ android 怎麼鎖nt數據到資源文件中

我們知道,在Android系統中,每一個應用程序一般都會配置很多資源,用來適配不同密度、大小和方向的屏幕,以及適配不同的國家、地區和語言等等。這些資源是在應用程序運行時自動根據設備的當前配置信息進行適配的。這也就是說,給定一個相同的資源ID,在不同的設備配置之下,查找到的可能是不同的資源。這個資源查找過程對應用程序來說,是完全透明的。在本文中,我們就詳細分析資源管理框架是如何根據ID來查找資源的。
從前面Android應用程序資源管理器(Asset Manager)的創建過程分析一文可以知道,Android資源管理框架實際就是由AssetManager和Resources兩個類來實現的。其中,Resources類可以根據ID來查找資源,而AssetManager類根據文件名來查找資源。事實上,如果一個資源ID對應的是一個文件,那麼Resources類是先根據ID來找到資源文件名稱,然後再將該文件名稱交給AssetManager類來打開對應的文件的,這個過程如圖1所示。

圖1 應用程序查找資源的過程示意圖
在圖1中,Resources類根據資源ID來查到資源名稱實際上也是要通過AssetManager類來實現的,這是因為資源ID與資源名稱的對應關系是由打包在APK裡面的resources.arsc文件中的。當Resources類查找的資源對應的是一個文件的時候,它就會再次將資源名稱交給AssetManager,以便後者可以打開對應的文件,否則的話,上一步找到的資源名稱就是最終的查找結果。
從前面Android應用程序資源的編譯和打包過程分析一文可以知道,APK包裡面的resources.arsc文件是在編譯應用程序資源的時候生成的,然後連同其它被編譯的以及原生的資源一起打包在一個APK包裡面。
從前面Android資源管理框架(Asset Manager)簡要介紹和學習計劃一文又可以知道,Android應用程序資源是可以劃分是很多類別的,但是從資源查找的過程來看,它們可以歸結為兩大類。第一類資源是不對應有文件的,而第二類資源是對應有文件的,例如,字元串資源是直接編譯在resources.arsc文件中的,而界面布局資源是在APK包裡面是對應的單獨的文件的。如上所述,不對應文件的資源只需要執行從資源ID到資源名稱的轉換即可,而對應有文件的資源還需要根據資源名稱來打開對應的文件。在本文中,我們就以界面布局資源的查找過程為例,來說明Android資源管理框架查找資源的過程。
我們知道,每一個Activity組件創建的時候,它的成員函數onCreate都會被調用,而在Activity組件的成員函數onCreate中,我們基本上都無一例外地調用setContentView來設置Activity組件的界面。在調用Activity組件的成員函數setContentView的時候,需要指定一個layout類型的資源ID,以便Android資源管理框架可以找到指定的Xml資源文件來填充(inflate)為Activity組件的界面。接下來,我們就從Activity類的成員函數setContentView開始,分析Android資源管理框架查找layout資源的過程,如圖2所示。

圖2 類型為layout的資源的查找過程
這個過程可以分為22個步驟,接下來我們就詳細分析每一個步驟。
Step 1. Activity.setContentView

public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks {
......

private Window mWindow;
......

public Window getWindow() {
return mWindow;
}

.....

public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
}

......
}
這個函數定義在文件frameworks/base/core/java/android/app/Activity.java中。
從前面Android應用程序窗口(Activity)的窗口對象(Window)的創建過程分析一文可以知道,Activity類的成員變數mWindow指向的是一個PhoneWindow對象,因此,Activity類的成員函數setContentView實際上是調用PhoneWindow類的成員函數setContentView來進一步操作。
Step 2. PhoneWindow.setContentView

public class PhoneWindow extends Window implements MenuBuilder.Callback {
......

// This is the view in which the window contents are placed. It is either
// mDecor itself, or a child of mDecor where the contents go.
private ViewGroup mContentParent;
......

private LayoutInflater mLayoutInflater;
......

@Override
public void setContentView(int layoutResID) {
if (mContentParent == null) {
installDecor();
} else {
mContentParent.removeAllViews();
}
mLayoutInflater.inflate(layoutResID, mContentParent);
final Callback cb = getCallback();
if (cb != null) {
cb.onContentChanged();
}
}

......
}
這個函數定義在文件frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java中。

PhoneWindow類的成員變數mContentParent用來描述一個類型為DecorView的視圖對象,或者這個類型為DecorView的視圖對象的一個子視圖對象,用作UI容器。當它的值等於null的時候,就說明當前正在處理的Activity組件的視圖對象還沒有創建。在這種情況下,就會調用成員函數installDecor來創建當前正在處理的Activity組件的視圖對象。否則的話,就說明是要重新設置當前正在處理的Activity組件的視圖。在重新設置之前,首先調用成員變數mContentParent所描述的一個ViewGroup對象來移除原來的UI內容。
PhoneWindow類的成員變數mLayoutInflater指向的是一個PhoneLayoutInflater對象。PhoneLayoutInflater類是從LayoutInflater類繼續下來的,同時它也繼承了LayoutInflater類的成員函數inflate。通過調用PhoneWindow類的成員變數mLayoutInflater所指向的一個PhoneLayoutInflater對象的成員函數inflate,也就是從父類繼承下來的成員函數inflate,就可以將參數layoutResID所描述的一個UI布局設置到mContentParent所描述的一個視圖容器中去。這樣就可以將當前正在處理的Activity組件的UI創建出來。
最後,PhoneWindow類的成員函數還會調用一個Callback介面的成員函數onContentChanged來通知當前正在處理的Activity組件,它的視圖內容發生改變了。從前面Android應用程序窗口(Activity)的窗口對象(Window)的創建過程分析一文可以知道,每一個Activity組件都實現了一個Callback介面,並且將這個Callback介面設置到了與它所關聯的PhoneWindow的內部去,因此,最後調用的實際上是Activity類的成員函數onContentChanged。
接下來,我們就繼續分析LayoutInflater類的成員函數inflate的實現,以便可以了解Android資源管理框架是如何找到參數layoutResID所描述的UI布局文件的。
Step 3. LayoutInflater.inflate

public abstract class LayoutInflater {
......

public View inflate(int resource, ViewGroup root) {
return inflate(resource, root, root != null);
}

......

public View inflate(int resource, ViewGroup root, boolean attachToRoot) {
......
XmlResourceParser parser = getContext().getResources().getLayout(resource);
try {
return inflate(parser, root, attachToRoot);
} finally {
parser.close();
}
}

......
}
這個函數定義在文件frameworks/base/core/java/android/view/LayoutInflater.java中。
LayoutInflater類兩個參數版本的成員函數inflate通過調用三個參數版本的成員函數inflate來查找參數resource所描述的UI布局文件。
在LayoutInflater類三個參數版本的成員函數inflate中,首先是獲得用來描述當前運行上下文環境的一個Resources對象,然後接調用這個Resources對象的成員函數getLayout來查找參數resource所描述的UI布局文件。
Resources類的成員函數getLayout找到了指定的UI布局文件之後,就會打開它。由於Android系統的UI布局文件是一個Xml文件,因此,Resources類的成員函數getLayout打開它之後,得到的是一個XmlResourceParser對象。有了這個XmlResourceParser對象之後,LayoutInflater類三個參數版本的成員函數inflate就將它傳遞給另外一個三個參數版本的成員函數inflate,以便後者可以通過它來創建一個UI界面。
接下來,我們就首先分析Resources類的成員函數getLayout的實現,然後再分析LayoutInflater類的另外一個三個參數版本的成員函數inflate的實現。

Ⅷ android資源文件有哪些適配的後綴名

第一種後綴:sw<N>dp,如layout-sw600dp, values-sw600dp
這里的sw代表smallwidth的意思,當你所有屏幕的最小寬度都大於600dp時,屏幕就會自動到帶sw600dp後綴的資源文件里去尋找相關資源文件,這里的最小寬度是指屏幕寬高的較小值,每個屏幕都是固定的,不會隨著屏幕橫向縱向改變而改變。
第二種後綴w<N>dp 如layout-w600dp, values-w600dp
帶這樣後綴的資源文件的資源文件制定了屏幕寬度的大於Ndp的情況下使用該資源文件,但它和sw<N>dp不同的是,當屏幕橫向縱向切換時,屏幕的寬度是變化的,以變化後的寬度來與N相比,看是否使用此資源文件下的資源。

Ⅸ android屏幕適配有哪些方法

Android 資源文件夾有其中兩種方式支持屏幕適配:
一、方法:
1.XXX XXX-ldpi XXX-mdpi XXX-hdpi XXX-xhdpi XXX-xxhdpi 這種方式 (推薦使用)
2.XXX XXX-123x456 後面是具體值(不推薦使用這種方式!)
當我們做適配處理時通常會在以上一堆文件夾中定義 xxx.xml 例如 定義一個 : <dimen name="list_item_height">100dip</dimen>
二、適配舉例:
Android的匹配機制和手機系統有關:
規則一:Android4.0 以上的手機,先尋找和設備吻合的文件夾里的相應文件里的資源,如果沒有找到會繼續匹配它下面(比它解析度或密度小)的一些文件夾,最後去XXX 默認文件夾中匹配。
eg1: 小米2s (4.1 1280x720) 有文件夾 XXX XXX-320x240 XXX-800x480 XXX-1280x719 XXX-1280x720 XXX-1280x721 XXX-xhdpi
1.匹配XXX-xhdpi
2.匹配XXX-1280x720
3.匹配XXX-1280x719
4.匹配XXX-480x800
5.匹配XXX-320x240
6.匹配XXX
eg2:HTC ONE (4.2 1920×1080)
規則二:Android4.0 以下的手機,先尋找和設備吻合的文件夾里的相應文件里的資源,如果沒有找到會繼續匹配它下面(比它密度小)的一些文件夾。
eg:三星m250L(同三星9100 2.3.7 800x480) 有文件夾 XXX XXX-320x240 XXX-800x479 XXX-480x800 XXX-ldpi XXX-mdpi XXX-hdpi
1.匹配XXX-hdpi
2.匹配XXX-mdpi
3.匹配XXX-480x800
4.匹配XXX
5.匹配XXX-ldpi
6.程序退出
eg3:華為U8860(2.3.6 854x480)
所以在項目中<dimen name="list_item_height">50dip</dimen> 分別定義在
values : <dimen name="list_item_height">50dip</dimen> 和
values-320x240 : <dimen name="list_item_height">42dip</dimen> 中.
小米2s 會取 values-320x240 中42dip 的值。

Ⅹ android適配器怎樣進行數據適配

顧名思義,就是把一些數據給弄得適當,適合以便於在View上顯示。適配器就像顯示器,把復雜的東西按人可以接受的方式來展現。也可以這樣來理解適配器,ListView通過適配器,理解我們要對ListView里加入什麼內容,而我們在適配器里@Override的方法,就是讓我們寫上我們要告訴這個ListView的一些基本內容。
可以說適配器就是數據和視圖之間的橋梁,學好適配器還是非常重要的。

讓我們先從各個方面理解適配器,然後看一些例子我想應該就可以徹底掌握它了!

適配器的工作原理:
適配器是怎麼處理得到的數據,並把它顯示出來的呢?其實很簡單,說白了適配器它也是一個類,在類裡面它實 現了父類的這幾個方法:
public int getCount() //得到數據的行數
public Object getItem(int position) //根據position得到某一行的記錄
public long getItemId(intposition) //的到某一條記錄的ID
還有最重要的:
publicView getView(intposition, View convertView, ViewGroup parent)
//相比於其它幾個方法這個方法是最重要的,它顯式的定義了適配器將要以什麼樣的方式去顯示我們所 填充的數據,在自定義的適配器裡面我們通常會給它寫個布局文件。
這些在最後的一兩個例子里會仔細講解,我們從簡單的看起:首先看看常用的適配器

我們常用的適配器一共有三個,當然不包含自定義的適配器:就是ArrayAdapter,SimpleAdapter,SimpleCursorAdapter 這三個,他們都是繼承於BaseAdapter 。

下面我會逐一介紹,我們在具體應用中來繼續學習Adapter:
說道Adapter不得不說道ListView,或者說用到ListView不得不提到Adapter
在android開發中ListView是比較常用的組件,它以列表的形式展示具體內容,並且能夠根據數據的長度自適應顯示。
而列表的顯示需要三個元素:
1.ListVeiw 用來展示列表的View。
2.適配器 用來把數據映射到ListView上的中介。
3.數據 具體的將被映射的字元串,圖片,或者基本組件。

根據列表的適配器類型,列表分為三種,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
其中以ArrayAdapter最為簡單,只能展示一行字。SimpleAdapter有最好的擴充性,可以自定義出各種效果。SimpleCursorAdapter可以認為是SimpleAdapter對資料庫的簡單結合,可以方面的把資料庫的內容以列表的形式展示出來

我們從最簡單的ListView開始(ArrayAdapter):

我打算把這幾種適配器的例子放在一個app裡面,然後上傳到我的資源,再分享鏈接給大家。所以我打算由MainActivity里的Button來跳轉到各個例子,現在讓我們一步步的把這個Demo寫出來。

項目開始啦!

(1)首先,新建一個app ,名字叫做 AdapterDemo ,先在activity_main.xml里添加一個button,一會跳轉的時候使用。

(2)然後新建一個類ArrayAdapterDemo繼承自Activity作為我們第一個小例子的Activity,@Override 我們的onCreate方法
新建一個xml文件arrayadapterdemo.xml作為我們的布局文件,其中包含一個文本域和一個ListView,代碼如下:
arrayadapterdemo.xml:
?

1
2
3
4
5
6
7
8
9
10

<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">

<textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="這是ArrayAdapter的一個例子">
</textview>

<listview android:id="@+id/arrayadapterdemolistview" android:layout_width="wrap_content" android:layout_height="wrap_content">
</listview>

</linearlayout>

(3)然後回到ArrayAdapterDemo,定義一個Listview暫且叫做lv,並且lv=(ListView)findViewById(R.id.arrayadapterdemolistview); ,setContentView()為剛才的xml布局,然後為lv設置一個適配器,這里使用的是安卓原生的ArrayAdapter(Context context, inttextViewResourceId, List objects)來裝配數據,要裝配這些數據就需要一個連接ListView視圖對象和數組數據的適配器 來兩者的適配工作。
ArrayAdapter的構造需要三個參數,依次為:this,布局文件(注意這里的布局文件描述的是列表的每一行的布局, android.R.layout.simple_list_item_1是系統定義好的布局文件只顯示一行文字,數據源(一個List集合)。同時用setAdapter()完 成適配的最後工作。
一般寫一個getData()方法來作為最後一個參數,最終代碼如下:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

package com.example.adapterdemo;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class ArrayAdapterDemo extends Activity {
private ListView lv;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.arrayadapterdemo);
lv=(ListView)findViewById(R.id.arrayadapterdemolistview);
lv.setAdapter(new ArrayAdapter<string>(this,
android.R.layout.simple_expandable_list_item_1, getData()));
}

public List<string> getData(){

List<string> data = new ArrayList<string>();
data.add("測試數據1");
data.add("測試數據2");
data.add("測試數據3");
data.add("測試數據4");

return data;

}

}
</string></string></string></string>

再在AndroidManifest.xml中注冊Activity並在主界面中完成button監聽跳轉就可以了。