Android 4.1(Jelly Bean) 在 TextView 和 EditText 元素里对“双向文字顺序”提供了有限的功能支持,允许应用程序在编辑和显示字符的时候,能够同时支持从左到右(LTR)以及从右到左(RTL)的排列格式。Android 4.2目前已经对“从右到左”的文字排列顺序给予了原生级别的全面支持,包括提供了一个布局镜面工具,使得开发者把能够将优质的用户体验带给每一位用户,不管该用户的书写顺序是从左到右,还是从右到左。
Android 4.2保证了该新特性不会影响到目前已经存在程序,如果之前的程序代码不修改,其应用的外观将维持现状。如果你想要修改程序,那么仅仅需要很小的改动,应用就可以自动地被“镜面反射”,这样就能轻易地将系统语言设置为从右到左的书写格式(阿拉伯语,希伯来语和波斯语都采用这种格式)。例如,下面的截图就展示了上述的设置效果:
从左到右的布局方式
要实现RTL(从右到左)的布局镜面反射,仅仅需要遵循下列步骤就可以做到:
1. 在你的应用程序声明文件(manifest)里声明开启RTL mirroring的支持。具体做法是:在manifest.xml声明文件的<application>元素中,添加 android:supportsRtl=”true”
2. 修改应用程序中所有的“left/right”布局属性,改为对应的”start/end”布局
1)如果你的应用程序是针对Android 4.2目标平台(应用的targetSdkVersion或者minSdkVersion是17或者更高), 那么你就应当用“start”和“end”替换原来的“left”和“right”。例如,android:paddingLeft应当被替换为android:paddingStart。
2) 如果你想让你的应用程序与Android 4.2之前的版本保持兼容(也就是与targetSdkVersion或者minSdkVersion为16或者更早的版本),那么你应当既加上“start”和“end”,又加上“left”和“right”。例如,你应当同时写上:adnroid:paddingLeft和android:paddingStart。
为了更精确地控制应用程序在UI上的文字书写顺序(从左到右,或者从右到左),Android 4.2 引入了如下的API:
android:layoutDirection —该属性设置组件的布局排列方向
android:textDirection — 该属性设置组件的文字排列方向
android:textAlignment — 该属性设置文字的对齐方式
getLayoutDirectionFromLocale() —该方法用于获取指定地区的惯用布局方式
在使用从右到左的排列方式时,你甚至创建自定义的布局方式,可绘制对象,以及其他资源。仅仅是简单地使用资源匹配器“ldrtl”对你的资源进行一下标识,你就可以把资源定义为“从右到左方向的资源”。在调试和优化从右到左的布局方面,HierarchyViewer目前支持对start/end属性,布局方向,文字方向,文字对齐方式等所有信息的层次化显示。
那么现在是时候为所有的用户开发优美的Android应用程序了,无论用户的文字语言习惯是从左到右,还是从右到左。我们非常期待看到这些优美应用的产生!
====================================================================================================
RTL布局支持
Android现在提供了一些API,使您可以构建更优雅的变换布局方向的用户界面。这些界面将支持由右到左(RTL)的语言和阅读方向。比如阿拉伯语和希伯来语。
为了使您的应用支持RTL布局,需要在manifest文件中设置元素的android:supportsRtl属性为“true”。一旦启用,该系统将启用各种RTLAPI来用RTL布局显示您的应用。举例来说,在操作栏中将操作按钮显示在左侧,而把图标和标题显示在右侧。所有您用框架提供的View类所构建的布局也会以相反的方向显示。
如果您需要在显示RTL布局时进一步优化您应用的外观,有两个基本层面的优化:
-
将左——右方向的布局属性转变为开始——结束方向的布局属性。
例如,用android:layout_marginStart替换android:layout_marginLeft,用android:layout_marginEnd替换android:layout_marginRight。
RelativeLayout类也提供了相应的布局属性,来替换左/右位置,如:android:layout_alignParentStart替换android:layout_alignParentLeft,用android:layout_toStartOf替换android:layout_toLeftOf。 -
或者,使用ldrtl资源限定词(ldrtl意味着布局方向由右至左)资源提供完整的针对RTL布局优化过的布局文件。例如,您可以在res/layout/目录保存您默认的配置文件,而在res/layout-ldrtl/目录下保存您针对RTL优化过的布局。
ldrtl限定词对drawable资源也很适用,这样您就可以提供与阅读方向相同的图片了。 - drawable 文件需要设置对应的尺寸标识:ldrtl是layout-direction-right-to-left的缩写,意味着布局方式从右到左,主要是为了适配阿拉伯语用。这应该是API17,即Android4.2上新出的功能。
- rtl布局中的linearLayout 是否支持反转效果。在android哪个版本的系统才支持,是否支持listItem的linearLayout。:在android4.2/sdk17及以后的版本中是支持的,包括listView的scrollBar所在位置
框架中还有各种其它的支持RTL布局的API,比如,在View类中,您可以在定制的view中实现适当的行为;在Configuration类中,可以查询当前的布局方向。
注意:如果您用SQLite而表名或列名使用了“仅允许数字”特性。请小心:当您的设备设置为阿拉伯地区,使用String.format(String,Object...)方法时会因为数字转换成对应的阿拉伯文而导致错误。您必须使用String.format(Locale,String,Object...),以确保数字以ASCII的编码保存。还可以使用String.format("%d",int)来取代String.valueOf(int)以格式化数字。
===================
Bug 实例:
res/layout-ldrtl/ xxx.xml ,添加对应不需要RTL 显示的layout或组件 android:textDirection ="ltr"