https://developer.android.com/guide/practices/screens-distribution
設(shè)備兼容性和應(yīng)用兼容性
如需了解您可以用來通過 Google Play 商店控制應(yīng)用對(duì)用戶是否可用的所有過濾器,請(qǐng)參閱 Google Play 上的過濾器文檔。
平臺(tái)版本
- 不同的設(shè)備可能會(huì)運(yùn)行不同版本的 Android 平臺(tái)
- 每個(gè)后續(xù)的平臺(tái)版本通常會(huì)添加之前版本中不可用的新 API。
- 為表明可用的 API 集,每個(gè)平臺(tái)版本都會(huì)指定 API 級(jí)別。
- 通過 API 級(jí)別,您可以使用
<uses-sdk>清單標(biāo)記及其minSdkVersion屬性來聲明應(yīng)用兼容的最低版本 -
minSdkVersion屬性聲明應(yīng)用兼容的最低版本,targetSdkVersion屬性聲明應(yīng)用經(jīng)過優(yōu)化后適用的最高版本。 - 不過,請(qǐng)注意
<uses-sdk>元素中的屬性會(huì)被替換為build.gradle文件中的相應(yīng)屬性 - 如果您使用的是 Android Studio,則必須在其中指定 minSdkVersion 和 targetSdkVersion 值
- 要詳細(xì)了解
build.gradle文件,請(qǐng)參閱如何配置編譯版本
屏幕配置
為了簡(jiǎn)化不同的配置,Android 將這些變體歸納成組,使它們更容易作為定位目標(biāo):
四種廣義的尺寸:小、標(biāo)準(zhǔn)、大和特大。
還有幾種廣義的密度:mdpi(中)、hdpi(高)、xhdpi(超高)、xxhdpi(超超高)等。
如需了解如何針對(duì)不同屏幕創(chuàng)建備用資源以及如何在必要時(shí)將應(yīng)用限制為特定屏幕尺寸,請(qǐng)參閱支持不同屏幕。
應(yīng)用兼容
如需了解如何針對(duì)各種不同屏幕構(gòu)建應(yīng)用的具體說明,請(qǐng)參閱以下頁面:
屏幕尺寸
屏幕尺寸是系統(tǒng)為您的應(yīng)用界面所提供的可見空間。 應(yīng)用的屏幕尺寸并非設(shè)備的實(shí)際屏幕尺寸,而是綜合考慮屏幕方向、系統(tǒng)裝飾(如導(dǎo)航欄)和窗口配置更改(例如,當(dāng)用戶啟用多窗口模式時(shí))后的尺寸。
靈活布局
默認(rèn)情況下,Android 會(huì)調(diào)整應(yīng)用布局的大小以適應(yīng)當(dāng)前屏幕。 為確保布局調(diào)整能很好地適應(yīng)屏幕尺寸的微小變化,您需要靈活地實(shí)現(xiàn)布局。 您必須遵循一項(xiàng)核心原則,即避免對(duì)界面組件的位置和大小進(jìn)行硬編碼。 您應(yīng)允許拉伸視圖尺寸并指定視圖相對(duì)于父視圖或其他同級(jí)視圖的位置,這樣即便布局?jǐn)U大,您期望的順序和相對(duì)大小也會(huì)保持不變。
使用 ConstraintLayout
如需創(chuàng)建適用于不同屏幕尺寸的自適應(yīng)布局,最佳做法是將
ConstraintLayout用作界面中的基本布局。
使用
ConstraintLayout,您可以根據(jù)布局中視圖之間的空間關(guān)系指定每個(gè)視圖的位置和大小通過ConstraintLayout這種方式,當(dāng)屏幕尺寸改變時(shí),所有視圖都可以一起移動(dòng)和拉伸。
使用
ConstraintLayout構(gòu)建布局,最簡(jiǎn)單的方法是使用 Android Studio 中的布局編輯器。借助該工具,您可以將新視圖拖動(dòng)到布局中,將其約束條件附加到父視圖和其他同級(jí)視圖以及修改視圖的屬性,完全不必手動(dòng)修改任何 XML(請(qǐng)參見圖 1)。如需了解詳情,請(qǐng)參閱使用 ConstraintLayout 構(gòu)建自適應(yīng)界面。
但是,
ConstraintLayout并不能解決所有布局場(chǎng)景(特別是動(dòng)態(tài)加載的列表,對(duì)于此類布局,應(yīng)使用 RecyclerView
避免使用硬編碼的布局尺寸
為了確保布局能夠靈活地使用不同的屏幕尺寸。
- "wrap_content" 指示視圖將其尺寸設(shè)為適配該視圖中相應(yīng)內(nèi)容所需的尺寸。
- "match_parent" 使視圖在父視圖中盡可能地展開
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/lorem_ipsum" />
使用
ConstraintLayout時(shí),不得使用match_parent。而應(yīng)將尺寸設(shè)為0dp以啟用一種稱為“匹配約束”的特殊行為,該行為通常與match_parent的預(yù)期行為相同。如需了解詳情,請(qǐng)參閱如何調(diào)整 ConstraintLayout 中的視圖尺寸。
備用布局
靈活布局非常重要,但您還應(yīng)設(shè)計(jì)不同的布局,以便根據(jù)不同設(shè)備(如手機(jī)和平板電腦)上的可用空間優(yōu)化用戶體驗(yàn)。 因此,Android 允許您提供備用布局文件,而系統(tǒng)會(huì)在運(yùn)行時(shí)根據(jù)當(dāng)前設(shè)備的屏幕尺寸應(yīng)用這些文件。
您為手機(jī)設(shè)計(jì)的界面或許無法在平板電腦上提供良好的體驗(yàn)。因此,您的應(yīng)用還應(yīng)提供備用布局資源,以針對(duì)特定屏幕尺寸優(yōu)化界面設(shè)計(jì)。
您可以通過創(chuàng)建額外的 res/layout/ 目錄提供特定于屏幕的布局(針對(duì)需要不同布局的每種屏幕配置創(chuàng)建一個(gè)目錄),然后將屏幕配置限定符附加到 layout 目錄名稱(例如,對(duì)于可用寬度為 600dp 的屏幕,附加限定符為 layout-w600dp)。
這些配置限定符表示應(yīng)用界面可用的可見屏幕空間。從應(yīng)用中選擇布局時(shí),系統(tǒng)會(huì)考慮所有系統(tǒng)裝飾(例如導(dǎo)航欄)和窗口配置更改。
使用最小寬度限定符
使用“最小寬度”屏幕尺寸限定符,您可以為具有最小寬度(以密度無關(guān)像素 dp 或 dip 為度量單位)的屏幕提供備用布局
通過將屏幕尺寸描述為密度無關(guān)像素的度量值,Android 允許您創(chuàng)建專為非常具體的屏幕尺寸而設(shè)計(jì)的布局,同時(shí)讓您不必對(duì)不同的像素密度有任何擔(dān)心。
例如,您可以創(chuàng)建一個(gè)名為 main_activity 且針對(duì)手機(jī)和平板電腦進(jìn)行了優(yōu)化的布局,方法是在目錄中創(chuàng)建該文件的不同版本,如下所示:
res/layout/main_activity.xml # For handsets (smaller than 600dp available width)
res/layout-sw600dp/main_activity.xml # For 7” tablets (600dp wide and bigger)
最小寬度限定符指定屏幕兩側(cè)的最小尺寸,而不考慮設(shè)備當(dāng)前的屏幕方向,因此這是一種指定布局可用的整體屏幕尺寸的簡(jiǎn)單方法。
下面是其他最小寬度值與典型屏幕尺寸的對(duì)應(yīng)關(guān)系:
320dp:典型手機(jī)屏幕(240x320 ldpi、320x480 mdpi、480x800 hdpi 等)。
480dp:約為 5 英寸的大手機(jī)屏幕 (480x800 mdpi)。
600dp:7 英寸平板電腦 (600x1024 mdpi)。
720dp:10 英寸平板電腦(720x1280 mdpi、800x1280 mdpi 等)。

請(qǐng)記住,最小寬度限定符的所有數(shù)值都是密度無關(guān)像素,因?yàn)橹匾氖窍到y(tǒng)考慮像素密度(而不是原始像素分辨率)之后可用的屏幕空間量。
使用可用寬度限定符
您可能希望根據(jù)當(dāng)前【可用的寬度或高度】來更改布局,而不是根據(jù)屏幕的【最小寬度】來更改布局。
您可能希望根據(jù)當(dāng)前可用的寬度或高度來更改布局,而不是根據(jù)屏幕的最小寬度來更改布局:
res/layout/main_activity.xml # For handsets (smaller than 600dp available width)
res/layout-w600dp/main_activity.xml # For 7” tablets or any screen with 600dp
# available width (possibly landscape handsets)
如果您關(guān)心可用高度,則可以使用“可用高度”限定符來執(zhí)行相同的操作。例如,對(duì)于屏幕高度至少為 600dp 的屏幕,請(qǐng)使用限定符 layout-h600dp。
添加屏幕方向限定符
雖然您可能只需將“最小寬度”和“可用寬度”限定符結(jié)合使用即可支持所有尺寸變化,但是您可能還希望當(dāng)用戶在縱向與橫向之間切換屏幕方向時(shí)改變用戶體驗(yàn)。
為此,您可以將 port 或 land 限定符添加到資源目錄名稱中。只需確保這些限定符在其他尺寸限定符后面即可。例如:
res/layout/main_activity.xml # For handsets
res/layout-land/main_activity.xml # For handsets in landscape
res/layout-sw600dp/main_activity.xml # For 7” tablets
res/layout-sw600dp-land/main_activity.xml # For 7” tablets in landscape
如需詳細(xì)了解所有屏幕配置限定符,請(qǐng)參閱提供資源指南中的表 2。
使用Fragment 將界面組件模塊化
在針對(duì)多種屏幕尺寸設(shè)計(jì)應(yīng)用時(shí),您希望確保不會(huì)在 Activity 之間不必要地重復(fù)界面行為。因此,您應(yīng)該使用 Fragment將界面邏輯提取到單獨(dú)的組件中。然后,您可以組合 Fragment 以便在大屏幕設(shè)備上運(yùn)行時(shí)創(chuàng)建多窗格布局,或者在手機(jī)上運(yùn)行時(shí)將 Fragment 放置在單獨(dú)的 Activity 中。
如需了解詳情,請(qǐng)參閱使用 Fragment 構(gòu)建動(dòng)態(tài)界面。
可拉伸圖像(創(chuàng)建可拉伸的九宮格位圖)
針對(duì)所有屏幕尺寸進(jìn)行測(cè)試
務(wù)必針對(duì)各種屏幕尺寸測(cè)試您的應(yīng)用,以便確保界面正確縮放。如果您無法訪問具有各種不同屏幕尺寸的物理設(shè)備,則可以使用 Android 模擬器模擬任何屏幕尺寸。
如果您希望在物理設(shè)備上進(jìn)行測(cè)試,但又不想購買設(shè)備,則可以使用 Firebase 測(cè)試實(shí)驗(yàn)室訪問 Google 數(shù)據(jù)中心內(nèi)的設(shè)備。
聲明特定的屏幕尺寸支持
如果您不想讓您的應(yīng)用以特定的屏幕尺寸運(yùn)行,您可以設(shè)置屏幕尺寸限制,甚至可以根據(jù)設(shè)備的屏幕配置限制哪些設(shè)備可以安裝您的應(yīng)用。如需了解詳情,請(qǐng)參閱聲明受限屏幕支持。
聲明最大寬高比
- 為了支持盡可能多的設(shè)備,應(yīng)用應(yīng)動(dòng)態(tài)調(diào)整其布局,以確保其內(nèi)容和控件可見且安排合理。
-
多窗口模式適用于在 Android 7.0(API 級(jí)別 24)或更高版本中運(yùn)行的所有應(yīng)用,并且應(yīng)用默認(rèn)可調(diào)整大小。
您還可以為整個(gè)應(yīng)用或特定 Activity 明確設(shè)置屬性android:resizeableActivity true。
如果您不希望自己的應(yīng)用或 Activity 在多窗口模式下運(yùn)行,請(qǐng)?jiān)O(shè)置 android:resizeableActivity false。 - 如果您的應(yīng)用布局無法適應(yīng)寬高比過大的屏幕,則您可以通過設(shè)置最大寬高比顯式強(qiáng)行要求在所有 Android 操作系統(tǒng)級(jí)別上采用寬屏顯示。我們建議使用 2.4 (12:5) 的比例。
限制應(yīng)用僅支持平板電腦或電視
您可以使用 <supports-screens> 清單元素來阻止手機(jī)設(shè)備下載您的應(yīng)用。
<manifest ... >
<supports-screens android:smallScreens="false"
android:normalScreens="false"
android:largeScreens="true"
android:xlargeScreens="true"/>
...
</manifest>
限制應(yīng)用僅支持特定尺寸和密度
您可以使用 <compatible-screens> 清單元素來指定應(yīng)用支持的確切屏幕尺寸和密度。但是,我們強(qiáng)烈建議您不要使用此功能,因?yàn)槟粗付ǖ娜魏纬叽绾兔芏冉M合都會(huì)被視為與您的應(yīng)用不兼容的屏幕配置。因此,使用此元素很容易為應(yīng)用屏蔽掉很多實(shí)際支持安裝此應(yīng)用的設(shè)備。
<manifest ... >
<compatible-screens>
<!-- all small size screens -->
<screen android:screenSize="small" android:screenDensity="ldpi" />
<screen android:screenSize="small" android:screenDensity="mdpi" />
<screen android:screenSize="small" android:screenDensity="hdpi" />
<screen android:screenSize="small" android:screenDensity="xhdpi" />
<!-- all normal size screens -->
<screen android:screenSize="normal" android:screenDensity="ldpi" />
<screen android:screenSize="normal" android:screenDensity="mdpi" />
<screen android:screenSize="normal" android:screenDensity="hdpi" />
<screen android:screenSize="normal" android:screenDensity="xhdpi" />
</compatible-screens>
...
<application ... >
...
<application>
</manifest>