RTL的实现

好久没写博文了。
最近在忙RTL的事,网上搜了一下,貌似没看不到一些很好的博文。想写一下,今晚月色不错,适合写博文。。。

RTL 全称是 Right to Left。是 Android 支持从右往左念的语言,如阿拉伯语。支持的标记总的来说是:

1 在 AndroidManifest.xml 中

2 在一些需要支持 RTL 的控件中(默认是不转的), 做 RTL 的标记,如 layout 相关的使用 layoutDirection=”locale”, TextView 等的使用textDirection=”locale”; locale 的意思是 控件的方向视当前语言而定。

3 将 xml 中 Left Right 改成 Start 和 End, 源码中 处理 Start 与 End 会判断当前语言是否 RTL,如果是 那么 Start 属性将是 Right, End 属性将是 Left。 如 paddingLeft 与 paddingStart

4 ldrtl ( layout-direction-right-to-left ): 举两个例子, layout-ldrtl:表示在当前语言为 RTL 语言时,该文件夹下的文件将会去覆盖 (overlay) 一下 layout 文件夹下的 xml 文件。这个在 RTL 与 LTR 的布局相差很大时很好用,只需将 LTR 的放置在 layout(默认读取)目录下,将 RTL 的放置在 layout-ldrtl 目录下。另一个例子: drawable-ldrtl 与上一个相同,即默认读取的是 drawable, 如果当前语言是 RTL 的,将看 drawable-ldrtl 后再看 drawable。

5 一般图片在 RTL 下与在 LTR 下的其实只是反转一下的问题,不应该又放同样内容方向互逆的图片在 drawable-ldrtl 中。这里有 mirror 属性,表示在 RTL 中自动镜像 对于 selector 有 autoMirrored=”true”,好像还有 mirrorForRtl 属性 (生活用的电脑木有代码,记性太差) 这种方法好处在于节省空间,无需复制一个图片放置在 drawable-ldrtl 中。

细节问题了:
1 popupwindow RTL 的方法:
在 popupwindow showAtLocation 方法中 gravity 属性, 默认是 Gravity.NO_GRAVITY, 而这个在源码中 表示 Gravity.LEFT | Gravity.TOP(左上角)。而 RTL 中 需要从右上角往左下角,所以需要将 gravity 设为 Gravity.RIGHT | Gravity.TOP

2 当你发现语言已经是阿拉伯语了, 上述的都设了,为什么有些控件还是 LTR 的格式,这个时候 尝试

Configuration config = getActivity().getResources().getConfiguration(); 
 //这次居然为 false
config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;

这个的原因未明,只是有一次发现在阿拉伯语下 居然没反转,读了一下发现 context 是 LTR 的。再去获得一下 config.locale 发现已经是 fa-IR(伊朗)了,尝试:

config.setLayoutDirection(config.locale);

work 了。 自交大法好 = =

3 String.format 输出数字不正常:
这个主要是语言引起的。String.format 会调用到 String.format(Locale.getCurrent(), String format, args…); 由于是阿拉伯语,所以数字就被转了,要想阿拉伯数字在阿拉伯语下不转成阿拉伯语(有点绕 (-_-)可以

Locale en_US = new Locale("en_US");
String.format(en_US, formatter, args); 

你可能感兴趣的:(Android)