Android 佈局之 RTL
中東國家地區須要適配 RTL的佈局,顧名思義支持從右至左佈局android
前提:在AndroidManifest.xml文件中 <application 設置屬性app
android:supportsRtl=true ,表示應用支持RTL佈局此外TargetSdkVersion>=17,若不設置中東語言可開啓開發者選項中強制使用從右至左佈局佈局
支持RTL佈局時,佈局參數要儘可能避免使用left 或rightui
1.問題描述:
設置項,美顏圖標不支持RTL佈局,spa
- 查詢在AndroidManifest.xml 文件 android:supportsRtl= true
- 開發者選項開啓強制使用從左至右佈局,設置項,美顏圖標仍不支持RTL
2.緣由:
查詢對應組件的佈局參數.net
- 美顏圖標 佈局參數使用 「left」,「right」
android:layout_alignParentRight code
android:layout_marginRight xml
(2)設置項子viewblog
自定義控件佈局onLayOut時判斷是不是RTL開發
部分layout並未使用start/end標記,而是使用的left/right標記;2.自定控件未作反向處理 將Layout中left/right的屬性換成start/end標記;
- 在自定義控件中檢查當前是不是RTL反向類型,若是是就反向遍歷添加子View
3.源碼解讀:
判斷當前的佈局方向
public static final int LAYOUT_DIRECTION_LTR = LayoutDirection.LTR;
public static final int LAYOUT_DIRECTION_RTL = LayoutDirection.RTL;
View.LAYOUT_DIRECTION_LTR
View.LAYOUT_DIRECTION_RTL
public int getLayoutDirection() {
final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion;
if (targetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR1) {
mPrivateFlags2 |= PFLAG2_LAYOUT_DIRECTION_RESOLVED;
return LAYOUT_DIRECTION_RESOLVED_DEFAULT;
}
return((mPrivateFlags2 & PFLAG2_LAYOUT_DIRECTION_RESOLVED_RTL) ==
PFLAG2_LAYOUT_DIRECTION_RESOLVED_RTL) ? LAYOUT_DIRECTION_RTL : LAYOUT_DIRECTION_LTR;
}
注意:計算子View之間的間距,子View和父佈局之間的距離,根據是否支持RTL,從新計算起始子View的佈局參數
4.問題
設置系統語言或者直接打開開發者選項的強制RTL 影響佈局方向的機制??
科普參考:
(1)https://blog.csdn.net/lj19851227/article/details/12027321?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160566488919724842901184%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160566488919724842901184&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-12027321.pc_first_rank_v2_rank_v28&utm_term=Android+RTL&spm=1018.2118.3001.4449
(2)https://codegg.blog.csdn.net/article/details/46564025?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-8.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-8.edu_weight