Android RTL適配:需要做哪些工作

Android RTL適配:需要做哪些工作呢?

一. 序

越來越多的公司 App,都開始淘金海外,尋找更多的機會。然而海外市場千差萬別晨缴,無論是市場還是用戶的使用習慣译秦,都有諸多的不同。

當你接觸一款出海 App 的時候击碗,除了需要了解海外 Google Service 的整個生態(tài)圈筑悴,還要做好不同語言的適配。語言適配最通用的做法就是根據(jù)不同系統(tǒng)語言設定延都,配置不同的語言資源(strings.xml)雷猪,而其中比較特殊的就是例如阿拉伯的 RTL 布局,它不僅改變了語言晰房,還改變了 UI 布局和使用習慣求摇。

我們常用的習慣,稱之為 LTR(Left-To-Right)殊者,其意為我們的閱讀和書寫習慣与境,是從左向右延伸的。而 RTL(Right-To-Left) 則正好相反猖吴,它的閱讀和使用的習慣都是從右向左摔刁,常見使用 RTL 習慣的語言有阿拉伯語、希伯來語等海蔽。

今天就來聊聊共屈,一個成熟的 Android App,想要做 RTL 適配党窜,需要關(guān)注什么拗引,想要適配 RTL 有哪些任務清單。

如果你維護的 App 有國際化的要求幌衣,那這個問題是遲早需要面對的矾削。

二. Android 支持 RTL

2.1 什么是 RTL?

正如前面介紹的,RTL 是 Right-to-left 的縮寫哼凯,其意為閱讀和書寫的習慣欲间,是從右向左延伸的。再對比一下我國人自身的使用習慣断部,都是 LTR 的猎贴,也就是從左向右。

RTL 可以簡單理解是 LTR 的鏡像家坎,當需要適配 RTL 的時候嘱能,除了翻譯語言本身,還需要做到的就是 UI 布局虱疏,從中軸上鏡像反轉(zhuǎn)惹骂。

雖然 RTL 不符合我們國人的使用習慣,但是全球范圍內(nèi)依然有一部分人保持著 RTL 的習慣做瞪,比較常見的就是阿拉伯語对粪、希伯來語等。

就 Android 系統(tǒng)來說装蓬,Android 4.1 開始就在 TextView 和 EditView 中增加了對雙向文本的優(yōu)先支持著拭,允許其文本內(nèi)容從左向右(LTR)到從右向左(RTL)的顯示和切換。而在 Android 4.2 開始牍帚,增加了對 RTL 鏡像布局完全原生的支持儡遮。

也就是在 Android 4.2(Api Level 17)及之后,在 UI 上的布局鏡像暗赶,是原生支持的鄙币。在這些系統(tǒng)版本上,只要用戶系統(tǒng)語言切換到「RTL 系語言」蹂随,首先系統(tǒng) UI 會直接左右鏡像切換十嘿,此時如果你的 App 支持 RTL 鏡像布局時,也會自動切換布局方向岳锁。

2.2 App 如何支持 RTL 鏡像

正如前面介紹的一樣绩衷,LTR 到 RTL 的切換,不是由開發(fā)者控制的激率,而通常是由系統(tǒng)語言來控制的咳燕。

當系統(tǒng)語言切換為「RTL 系語言」時,還需要你的 App 支持 RTL 鏡像布局乒躺。

這里所謂的支持迟郎,其實只需要配置一個屬性即可,就是 AndroidManifest.xml 配置文件中的一個清單元素聪蘸。需要在?<applictaion>?標簽下,配置元素?android:supportsRtl="true"。

此時當系統(tǒng)語言切換的時候健爬,你的 App 也會跟著切換 UI 布局為鏡像后的效果控乾。

除了需要開啟?supportsRtl?屬性之外,還需要一些布局屬性的配合娜遵。

簡單來說蜕衡,就是將布局需要的所有 xxxLeft/xxxRight "替換"為 xxxStart/xxxEnd。

例如我們常用的 Padding 和 Margin设拟,都有類似 paddingLeft 和 layout_marginRight 屬性慨仿,這些就需要"替換"成 paddingStart 和 layout_marginEnd 屬性。當然不止于此纳胧,還有一些 gravity镰吆、drawableLeft 等屬性需要"替換"。原則上跑慕,所有?Left/Right?都需要變換為?Start/End?就好了万皿。

這些屬性,官方文檔中已經(jīng)幫我們列舉出來了核行。

到這里應該了解了牢硅,Android App 支持 RTL 鏡像的主要流程,就兩步:

App 增加?android:supports="true"?屬性芝雪。

調(diào)整 UI 布局屬性减余,從?left/right?到?start/end?切換。

那么問題來了惩系,我們在日常編碼的過程中位岔,應該使用 left/right 還是 start/end?還是兩者都需要蛆挫?

注意到我前面提到的 UI 布局屬性的替換時赃承,是打了引號的,你是否需要使用?start/end?來完全替換?left/right?悴侵,完全取決于 App 當前的 minSdkVersion 值瞧剖。

正如前面所提到的,Android 對 RTL 的原生支持可免,是在 Android 4.2 中才具備的抓于,也就是說,如果 App 的 minSdkVersion 大于等于 4.2浇借,你只需要使用?start/end?屬性捉撮,但如果還需要支持 4.2 以下的設備用戶,那就需要保留?left/right?和?start/end?兩者妇垢。

在低于 4.2 的系統(tǒng)中巾遭,不識別?supportsRtl?和?start/end?屬性肉康,所以不會造成影響。但是需要注意灼舍,在適配完成之后吼和,后續(xù)開發(fā)新頁面時的編碼習慣。

2.3 AS 助力調(diào)整布局屬性

如果當前需要適配的是一個成熟項目骑素,并且其中的布局習慣還是使用?left/right?系的屬性炫乓,那么針對所有頁面布局文件,進行手工調(diào)整就是一個非常大的工作量了献丑。

所幸的是 AS 提供了自動化的支持末捣。

你可以在?Refactor → Add RTL Support Where Possible?來開啟 RTL 的自動調(diào)整。

它會自動將項目中所有的?left/right?屬性都替換為?start/end?屬性创橄,如果想要適配 Android 4.2 以下的設備箩做,需要保留兩者,那么在 Run 之前筐摘,勾選?Relpace Left/Right Properties with Start/End Properties?選項即可卒茬。

早期的 AS 自動支持 RTL 布局的時候,效率會有一些問題咖熟,轉(zhuǎn)換的時候如果布局過多圃酵,可能會卡死,但是新版的 AS 已經(jīng)優(yōu)化了很多馍管,轉(zhuǎn)換效率上還是可以接受的郭赐。

另外這畢竟是自動替換,在替換完成之后确沸,還是需要每個頁面都測試一遍捌锭,看看效果才算完,有時候還需要我們做一些微調(diào)的工作罗捎。例如 AS 自動替換 RTL 布局的時候观谦,如果使用了?include?標簽,其中用到的方向?qū)傩圆粫惶鎿Q桨菜。

自動化雖然方便了我們機械的重復豁状,但也必須介入人工的干預符合預期。

三. RTL 細節(jié)調(diào)整

要做這種全全局的改動倒得,必然會有一些細節(jié)需要微調(diào)的泻红,這里簡單寫一些 RTL 布局中會需要使用到的細節(jié)調(diào)整技巧。

3.1 利用全局樣式霞掺,批量修改屬性

在適配 RTL 的過程中谊路,無法避免的就是有一些屬性必須要設置。例如 EditView 就需要設置以下屬性菩彬。

android:textAlignment="viewStart"

android:gravity="start"

android:textDirection="locale"

那我們就可以將這些屬性在 style.xml 中全局為 EditText 設置上缠劝。

...@style/EditTextStyle.Alignment...viewStartstartlocale

同時 TextView 也需要設置?android:textDirection?屬性潮梯,也可以采用相同的方法用 Style 的方式全局設置。

3.2 針對 RTL 的資源適配

除了布局上的適配之外剩彬,還有一些資源的適配酷麦,資源適配主要說兩塊內(nèi)容:Drawable(mipmap) 以及 Layout 布局資源。

先來說說 Drawable 的適配喉恋。例如在不同方向的布局下,使用不同的圖標母廷。

上圖就是個很典型的例子轻黑,在調(diào)整布局到 RTL 時,還需要注意返回「」的圖標也需要替換成「」琴昆。

這里依然使用 Android 對資源使用的限定符的方式氓鄙,可以創(chuàng)建?drawable-ldrtl?目錄,將翻轉(zhuǎn)后的圖標业舍,放在這個目錄下抖拦。如果需要限定 dpi,可以在目錄名后面追加舷暮。

res/

? drawable/

? ? a.png?

? drawable-ldrtl/

? ? a.png? // 對標 drawable/a.png 的 RTL 圖標

? drawable-xhdpi/

? ? b.png?

? drawable-ldrtl-xhdpi/

? ? b.png? // 對標 drawable-xhdpi/b.png 的 RTL 圖標

接下來再說說 Layout 布局的 RTL 布局效果適配态罪。有些特殊的頁面,可能光鏡像化還不夠下面,還需要針對性的做一些 UI 上的調(diào)整复颈,那最簡單的做法就是做兩套布局,互不影響沥割。

既然 Drawable 可以通過資源限定符的方式耗啦,設置 RTL 布局下使用的圖標,其實布局也可以机杜。

對于布局文件帜讲,可以在目錄下追加限定符?layout-ldrtl/,如果想對某個語言做布局適配椒拗,也可以增加語言限定似将,例如阿拉伯語可以用?layout-ar/。

res/? layout/? ? main.xml// 默認布局layout-ar/? ? main.xml// 阿拉伯語布局layout-ldrtl/? ? main.xml// RTL 布局

針對 RTL 的 UI 布局規(guī)范陡叠,Material Design 下有一個規(guī)范的文檔(https://material.io/design/usability/bidirectionality.html#localization)玩郊,設計師可以參考。

3.3 代碼判斷是否 RTL枉阵?

有些控件的屬性译红,是通過代碼動態(tài)調(diào)整的,那在使用的過程中兴溜,就需要在代碼中侦厚,判斷當前的環(huán)境耻陕,是 RTL 還是 LTF,才可以確定后續(xù)的屬性設置刨沦。

通過獲取 Configuration 的 locale 來判斷當前的環(huán)境诗宣,為了兼容,在 TextUtilsCompat 下也提供了類似的方法想诅。

publicbooleanisRtl(){returnTextUtilsCompat.getLayoutDirectionFromLocale(getContext().getResources().getConfiguration().locale) == ViewCompat.LAYOUT_DIRECTION_RTL;}

isRtl()?方法可以直接拿來使用召庞,依此判斷結(jié)果,執(zhí)行后續(xù)的操作来破。

3.4 不是所有控件都支持 RTL

雖說從 Android 4.2 開始篮灼,原生支持 RTL 方向布局,但是也有一些控件是不支持的徘禁,例如 ViewPager诅诱,就不支持 RTL 的方向。

這其實沒有什么很好的辦法送朱,要么和產(chǎn)品商量對此處的容忍娘荡,要么找一些其他的解決方案。

針對 ViewPager 的 RTL 化驶沼,在 Github 就有對應的開源庫 RtlViewPager(https://github.com/diego-gomez-olvera/RtlViewPager)?可供使用炮沐。其原理也是將數(shù)據(jù)進行倒序重排,沒什么好說的商乎,源碼不多央拖,有興趣可以自己看看。

四. 適配 RTL 要如何估期鹉戚?

再來聊聊適配 RTL 時鲜戒,估算開發(fā)周期的問題。

除了 App 本身在設計研發(fā)之初抹凳,就是為了中東的土豪設計的之外遏餐,多數(shù)情況下,我們都是因為各種外部原因赢底,需要在一款成熟的 App 上失都,適配 RTL 鏡像布局。例如市場驗證有大量「RTL 系語言」的付費用戶幸冻,或者產(chǎn)品經(jīng)理認為存在「RTL 系語言」的潛在用戶粹庞。

什么時候適配 RTL,完全是由外部因素決定的洽损。但是當需要適配的時候庞溜,我們作為開發(fā)者,最直觀要面對的現(xiàn)實問題就是碑定,適配 RTL 需要做哪些事流码?這個任務需要多少時間能夠完成又官?需要哪些人來配合,哪些任務是可以并行的漫试?

要精確估計 App 的 RTL 化六敬,很難,因為工作量主要來自適配驾荣,說到適配外构,工作量就可大可小了计贰。App 大量使用第三方控件的就比只使用原生控件的工作量大樊拓;產(chǎn)品經(jīng)理和設計師,允許部分頁面適配有差異的琉雳,也會比高要求還原的工作量大叮趴。

這些在適配完成之前,誰也不知道效果如何权烧,既然沒有什么好的方法眯亦,那就試一試吧,只需要三步般码,你可以拿著一個明確的鏡面翻轉(zhuǎn)效果妻率,來估計適配的難度。

設置?android:supportsRtl="true"板祝,讓 App 支持 RTL宫静。

AS 自動轉(zhuǎn)換布局屬性,支持 RTL 布局效果券时。

打開開發(fā)者選項中的「強制使用從右到左的布局方向」孤里,強制 RTL 布局。

此時你基本上可以看到一個 80% RTL 化的 App橘洞,剩下的就是把頁面都檢查一遍捌袜,看看有沒有用到哪些控件不支持 RTL,哪些 Drawable 需要替換炸枣、哪些布局需要微調(diào)虏等。然后針對性的調(diào)整即可。

有一些控件不支持 RTL 就會比較麻煩适肠,有源碼的就改改源碼霍衫,沒源碼的就看有沒有地方可以 Hook 解決。

總之需要做什么侯养,清單是固定的敦跌。有了明確的任務,自然就容易估計開發(fā)周期了沸毁。

列舉一下適配 RTL 的任務清單:

App 支持 RTL峰髓,AS 自動轉(zhuǎn)換布局屬性支持 RTL傻寂,從開發(fā)者選項里強制 RTL 布局方向。

按頁面排查携兵,檢查出需要翻轉(zhuǎn)的 Drawable 資源疾掰,打包交給設計師,反轉(zhuǎn)后替換徐紧。

檢查布局翻轉(zhuǎn)后的效果静檬,和設計師確定需要適配翻轉(zhuǎn)后的 UI 效果。

找到不支持 RTL 化的控件并级,可以從源碼的角度分析拂檩,能改源碼的改源碼,不能改源碼的嘗試 Hook 解決或找替代方案嘲碧。

翻譯 RTL 系語言資源 strings.xml稻励,放入對應的資源目錄,例如阿拉伯語需要放入 /values-ar/strings.xml 目錄愈涩,將系統(tǒng)語言切換到阿拉伯語望抽,排查所有頁面文字與控件的匹配度。

整體驗收履婉,微調(diào)效果煤篙。

其中需要和產(chǎn)品、設計毁腿、翻譯配合的辑奈,都可以提前準備,讓任務并行化已烤。當然在適配的過程中鸠窗,還有一些實際的問題,就需要遇到問題再解決問題了草戈。

五. 小結(jié)時刻

本文聊了如何在一個成熟的 App 上塌鸯,適配 RTL 鏡像效果,以及如何快速的適配唐片。最后還列出了一個適配時丙猬,需要調(diào)整關(guān)注的清單列表,希望對你有所幫助费韭。

本文就到這里茧球,如果有所幫助,留言星持、轉(zhuǎn)發(fā)抢埋、點好看是最大的支持,謝謝!

轉(zhuǎn)自:https://www.cnblogs.com/plokmju/p/android_rtl.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揪垄,一起剝皮案震驚了整個濱河市穷吮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饥努,老刑警劉巖捡鱼,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酷愧,居然都是意外死亡驾诈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門溶浴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乍迄,“玉大人,你說我怎么就攤上這事士败〈沉剑” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵谅将,是天一觀的道長生蚁。 經(jīng)常有香客問我,道長戏自,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任伤锚,我火速辦了婚禮擅笔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屯援。我一直安慰自己猛们,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布狞洋。 她就那樣靜靜地躺著弯淘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吉懊。 梳的紋絲不亂的頭發(fā)上庐橙,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音借嗽,去河邊找鬼态鳖。 笑死,一個胖子當著我的面吹牛恶导,可吹牛的內(nèi)容都是我干的浆竭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邦泄!你這毒婦竟也來了删窒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤顺囊,失蹤者是張志新(化名)和其女友劉穎肌索,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體包蓝,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡驶社,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了测萎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亡电。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖硅瞧,靈堂內(nèi)的尸體忽然破棺而出份乒,到底是詐尸還是另有隱情,我是刑警寧澤腕唧,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布或辖,位于F島的核電站,受9級特大地震影響枣接,放射性物質(zhì)發(fā)生泄漏颂暇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一但惶、第九天 我趴在偏房一處隱蔽的房頂上張望耳鸯。 院中可真熱鬧,春花似錦膀曾、人聲如沸县爬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽财喳。三九已至,卻和暖如春斩狱,著一層夾襖步出監(jiān)牢的瞬間耳高,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工喊废, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祝高,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓污筷,卻偏偏與公主長得像工闺,于是被迫代替她去往敵國和親乍赫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 概述 阿拉伯作為一個土豪帝國陆蟆,android在sdk17(Android4.2)也開始支持RTL(right to...
    Android深夜食堂閱讀 9,257評論 9 7
  • 本文為本人原創(chuàng)雷厂,轉(zhuǎn)載請注明作者和出處。 因為業(yè)務原因叠殷,產(chǎn)品需要適配阿拉伯語語改鲫、波斯語、烏爾都語林束。而這三種語言都是從...
    業(yè)松閱讀 6,896評論 0 5
  • 背景 阿拉伯語適配是一個比較麻煩的事情像棘,不止在于它文案的適配,更多的是在于其語言習慣的變化壶冒。由從左到右(LeftT...
    小笨狼閱讀 14,191評論 23 40
  • 該文章已歸納在本人 GitHub 的 Blog 倉庫胖腾,歡迎 star 或者 watch烟零。同時歡迎訪問我的博客地址 ...
    GoJun閱讀 30,605評論 6 34
  • APP國際化,說的直白應該也叫本土化或者本地化咸作,如果你的應用上線到谷歌應用市場锨阿,那么應該做好本地化的支持,用來支持...
    Find_A_Way閱讀 1,504評論 0 2