Android 官方 Training 文檔學(xué)習(xí)總結(jié)系列之「支持不同的設(shè)備」

Android 官方 Training 文檔學(xué)習(xí)總結(jié)系列

官方 Training 總結(jié)系列第二篇:支持不同的設(shè)備。

支持不同的語言

在任何情況下,從應(yīng)用代碼中提取 UI 字符串并將其存放在外部文件中都是個(gè)好辦法。Android 可以通過工程中的資源目錄輕松實(shí)現(xiàn)這一功能。

創(chuàng)建語言區(qū)域目錄和字符串文件

如需添加對(duì)更多語言的支持,在res/中創(chuàng)建一個(gè)額外的values目錄,并以連字符和ISO國家代碼結(jié)尾命名。例如,values-es/ 目錄包含的簡單資源用于語言代碼為“es”的語言區(qū)域。Android 根據(jù)運(yùn)行時(shí)設(shè)備的語言區(qū)域設(shè)置加載相應(yīng)的資源。

一旦確定了為哪些語言提供支持,便可創(chuàng)建資源子目錄和字符串資源文件。例如:

MyProject/
?? res/
????values/
??????strings.xml
????values-es/
??????strings.xml
????values-fr/
??????strings.xml

將各個(gè)語言區(qū)域的字符串值添加到相應(yīng)文件中。

在運(yùn)行時(shí),Android 系統(tǒng)會(huì)根據(jù)當(dāng)前為用戶設(shè)備設(shè)置的語言區(qū)域使用相應(yīng)的字符串資源集。

例如:英文,/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">My Application</string>
    <string name="hello_world">Hello World!</string>
</resources>

西班牙文,/values-es/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mi Aplicación</string>
    <string name="hello_world">Hola Mundo!</string>
</resources>

注:可以在任何資源類型上使用語言區(qū)域限定符(或任何配置限定符),例如,可以提供本地化版本的可繪制位圖。

使用字符串資源

可以在源代碼和其他 XML 文件中通過 < string >元素的 name 屬性來引用自己的字符串資源。

在源代碼中,可以使用語法 R.string.< string_name > 引用字符串資源。有許多方法都接受以這種方式引用的字符串資源。

例如:

// Get a string resource from your app's Resources
String hello = getResources().getString(R.string.hello_world);

// Or supply a string resource to a method that requires a string
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);

在其他 XML 文件中,只要 XML 屬性接受字符串值,可以使用語法 @string/<string_name> 引用字符串資源。

例如:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

適配不同的屏幕

Android 使用兩種常規(guī)屬性對(duì)不同的設(shè)備屏幕進(jìn)行分類:尺寸和密度。我們應(yīng)該在 APP 中包含一些替代資源,來適應(yīng)不同的屏幕尺寸和密度,以優(yōu)化 APP 的外觀。

  • 4 種普遍尺寸:小(small),普通(normal),大(large),超大(xlarge)
  • 4 種普遍密度:低精度(ldpi), 中精度(mdpi), 高精度(hdpi), 超高精度(xhdpi)

要為不同的屏幕聲明不同的 layout 和 bitmap,必須將這些替代資源放在不同的目錄中,類似于對(duì)不同語言字符串的做法

另請(qǐng)注意,屏幕方向(橫向或縱向)被認(rèn)為是屏幕尺寸的變化,因此許多應(yīng)用程序應(yīng)修改 layout,以優(yōu)化每個(gè)方向的用戶體驗(yàn)。

創(chuàng)建不同的 layout

要在不同的屏幕尺寸上優(yōu)化用戶體驗(yàn),應(yīng)該為要支持的每個(gè)屏幕尺寸創(chuàng)建一個(gè)唯一的布局 XML 文件。每個(gè) layout 都應(yīng)該保存到相應(yīng)的資源目錄中,并以 -< screen_size > 為后綴命名。例如,大尺寸屏幕(large screens)的唯一的 layout 文件應(yīng)該保存在 res/layout-large/ 中。

注意: 為了匹配合適的屏幕尺寸Android會(huì)自動(dòng)地測(cè)量我們的layout文件。所以不需要因不同的屏幕尺寸去擔(dān)心UI元素的大小,而應(yīng)該專注于layout結(jié)構(gòu)對(duì)用戶體驗(yàn)的影響。(比如關(guān)鍵視圖相對(duì)于同級(jí)視圖的尺寸或位置)

例如,此項(xiàng)目包括默認(rèn) layout 和大尺寸屏幕的替代布局:

MyProject/
?? res/
????layout/
??????main.xml
????layout-large/
??????main.xml

layout 文件的名字必須完全一樣,為了對(duì)相應(yīng)的屏幕尺寸提供最優(yōu)的 UI,文件的內(nèi)容不同。

如平常一樣在 app 中簡單引用:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

系統(tǒng)會(huì)根據(jù) app 所運(yùn)行的設(shè)備屏幕尺寸,在與之對(duì)應(yīng)的 layout 目錄中加載 layout。

注意:Android 3.2及以上版本支持定義屏幕尺寸的高級(jí)方法,它允許我們根據(jù)屏幕最小長度和寬度,為各種屏幕尺寸指定與密度無關(guān)的layout資源。

創(chuàng)建不同的位圖

應(yīng)該為 4 種普遍密度(分辨率):低,中,高,超高精度,都提供相適配的 bitmap 資源。這能使 app 在所有屏幕分辨率中都能有良好的畫質(zhì)和效果。

要生成這些圖像,應(yīng)該從原始的矢量圖像資源著手,然后根據(jù)下列尺寸比例,生成各種密度下的圖像。

  • xhdpi: 2.0
  • hdpi: 1.5
  • mdpi: 1.0 (基準(zhǔn))
  • ldpi: 0.75

這意味著,如果針對(duì) xhdpi 的設(shè)備生成了一張 200x200 的圖像,那么應(yīng)該為 hdpi 生成 150x150,為 mdpi 生成 100x100, 和為 ldpi 生成 75x75 的圖片資源。

然后,將文件放在相應(yīng)的 drawable 資源目錄中:

MyProject/
?? res/
???? drawable-xhdpi/
??????awesomeimage.png
????drawable-hdpi/
??????awesomeimage.png
????drawable-mdpi/
??????awesomeimage.png
????drawable-ldpi/
??????awesomeimage.png

任何時(shí)候引用@ drawable / awesomeimage,系統(tǒng)都會(huì)根據(jù)屏幕的密度選擇適當(dāng)?shù)?bitmap。

注意:低密度(ldpi)資源是非必要的,當(dāng)提供了hdpi的圖像,系統(tǒng)會(huì)把hdpi的圖像按比例縮小一半,去適配ldpi的屏幕。

支持不同的平臺(tái)版本

一般情況下,在更新 app 至最新 Android 版本時(shí),最好先保證新版的 app 可以支持 90% 的設(shè)備使用。

注:為了能在幾個(gè) Android 版本中都能提供最好的特性和功能,應(yīng)該在我們的 app 中使用 Android Support Library,它能使我們的app能在舊平臺(tái)上使用最近的幾個(gè)平臺(tái)的APIs。

指定最小和目標(biāo)API級(jí)別

AndroidManifest.xml 文件中描述了 app 的細(xì)節(jié)及 app 支持哪些 Android 版本。具體來說,< uses-sdk > 元素中的 minSdkVersion 和 targetSdkVersion 屬性,標(biāo)明在設(shè)計(jì)和測(cè)試 app 時(shí),最低兼容 API 的級(jí)別和最高適用的 API 級(jí)別(這個(gè)最高的級(jí)別是需要通過測(cè)試的)。例如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >
    <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
    ...
</manifest>

隨著新版本 Android 的發(fā)布,一些風(fēng)格和行為可能會(huì)改變,為了能使app能利用這些變化,而且能適配不同風(fēng)格的用戶的設(shè)備,應(yīng)該將 targetSdkVersion 的值盡量的設(shè)置與最新可用的 Android 版本匹配。

運(yùn)行時(shí)檢查系統(tǒng)版本

Android 在 Build 常量類中提供了對(duì)每一個(gè)版本的唯一代號(hào),在 app 中使用這些代號(hào)可以建立條件,保證依賴于高級(jí)別的 API 的代碼,只會(huì)在這些 API 在當(dāng)前系統(tǒng)中可用時(shí),才會(huì)執(zhí)行。

private void setUpActionBar() {
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        ActionBar actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

注意:當(dāng)解析 XML 資源時(shí),Android 會(huì)忽略當(dāng)前設(shè)備不支持的 XML 屬性。所以可以安全地使用較新版本的 XML 屬性,而不需要擔(dān)心舊版本 Android 遇到這些代碼時(shí)會(huì)崩潰。例如如果設(shè)置 targetSdkVersion="11",app 會(huì)在 Android 3.0 或更高時(shí)默認(rèn)包含 ActionBar。然后添加 menu items到 action bar 時(shí),需要在自己的 menu XML 資源中設(shè)置 android:showAsAction="ifRoom"。在跨版本的 XML 文件中這么做是安全的,因?yàn)榕f版本的 Android 會(huì)簡單地忽略 showAsAction 屬性(就是這樣,你并不需要用到 res/menu-v11/ 中單獨(dú)版本的文件)。

使用平臺(tái)樣式和主題

Android 提供了用戶體驗(yàn)主題,為 app 提供基礎(chǔ)操作系統(tǒng)的外觀和體驗(yàn)。這些主題可以在 manifest 文件中被應(yīng)用于 app 中。通過使用內(nèi)置的風(fēng)格和主題,app 自然地隨著 Android 新版本的發(fā)布,自動(dòng)適配最新的外觀和體驗(yàn)。

使 activity 看起來像對(duì)話框:

<activity android:theme="@android:style/Theme.Dialog">

使 activity 有一個(gè)透明背景:

<activity android:theme="@android:style/Theme.Translucent">

應(yīng)用在 /res/values/styles.xml 中定義的自定義主題:

<activity android:theme="@style/CustomTheme">

使整個(gè)app應(yīng)用一個(gè)主題(全部 activities )在元素中添加 android:theme 屬性:

<application android:theme="@style/CustomTheme">

ikook
2017.03.21


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容