在安卓應用上支援從右到左(RTL)佈局

sean.zhang發表於2017-10-17

世界上的大部分語言的書寫方式都是從左到右,但是也有一些語言是從右到左(Right to Left,以下簡稱為 RTL )書寫的,譬如阿拉伯語,希伯來語以及敘利亞語。雖然這些都是小語種,支援RTL能給當地使用者更好的體驗。

Google 官網得知,安卓在SDK17(4.2 Jelly Bean)版本的以上能原生的支援RTL,只需以下幾個步驟就能實現。

  1. AndroidManifest.xmluses-sdk 標籤中,將 targetSdkVersionminSdkVersion 設為 17 或以上。
  2. AndroidManifest.xmlapplication 標籤中,加入 android:supportsRtl=”true”
  3. 在佈局xml檔案中,將所有的 leftright 分別改為 startend,比如 android:paddingLeft 改為 android:paddingStart
  4. 由於startend 是安卓4.2以後才支援的,如果應用還要支援安卓4.2以下的舊裝置,則須在保留 leftright 的基礎上加入 startend,例如同時保留 android:paddingLeftandroid:paddingStart

如果你是用 Android Studio 的話,只需從 Refactor 選單選項裡點 Add RTL Support where possible 就可以一步到位完全上列操作。

同學們你以為這樣就結束的話就 too young too naive 了,安卓的套路大家都知道,哪能這麼容易放過碼農的?讓我們繼續。

安卓的 RTL 引擎會自動將水平佈局的排列顛倒,讓 UI 控制元件的排列順序變為從右到左,如圖所示。

1-U2o787CWvxwi5deBWQbEXA.png

請注意該圖中的圖示沒有左右翻轉,雖然看來也沒有什麼問題,但是如果我們換一個有方向性的圖示呢?請看下圖。

1-VBZGhVg_t1z3OprbfiEszg.png

這樣看起來就有點不對,後退鍵的方向應該指向右邊才是,像這種情況我們只能手動加入映象圖片,並用 ldrtl 字尾告之。假設後退鍵的圖片資源是放在 /res/drawable/ic_back.xml ,它的映象圖片的路徑就為 /res/drawable-ldrtl/ic_back.xml

1-zY8bpdRjU0E5CzyoyiWTzA.png

不僅僅是圖片,我們也可以用 ldrtl 字尾定義在RTL模式下的其它資源,比如顏色,佈局和字串等。

當安卓裝置的語言設定是任何RTL語言的時候,裝置預設的全域性佈局將自動變為 RTL。同學們也許會問,我不懂阿拉伯語,可以在測試環境下把佈局改成 RTL 來方便開發嗎?在開發者設定裡就有這個選項,選項的名稱和位置因機而異,在我的手機上是叫做 Force RTL layout direction

如果你的應用提供更該語言的選項,那麼就要注意在更改語言的同時也要調整合適的佈局。這裡就可以用 SDK 17的 Configuration 有一個新的API,使用方法如下。

Locale locale = getLocale();
Resources resources = context.getResources();
Configuration config = resources.getConfiguration();
config.locale = locale;
if (Build.VERSION.SDK_INT >= 17) {
   config.setLayoutDirection(locale);
}
resources.updateConfiguration(config, resources.getDisplayMetrics());

getLocale() 返回的是一個 RTL 佈局的語言時(如阿拉伯語),config.setLayoutDirection(locale) 將把應用的全域性佈局方向更新為 RTL 來顯示該語言。


相關文章