Android 应用支持RTL 阿语反转的UI适配处理看这一篇就够了

注意:应用程序支持RTL的布局需要在AndroidManifest.xml的中,添加android:supportsRtl=true。该声明代表您的应用程序是否支持从右到左(RTL)布局。targetSdkVersion设置为17或更高,则系统将激活并使用各种RTL API,以便您的应用程序可以显示RTL布局。如果设置为false或者targetSdkVersion设置为16或更低,则RTL API将被忽略或无效。

首先先从控件讲起,Android官方控件大多支持RTL,需要注意的控件如下:

1、TextView  一般情况下用wrap_content,这会使你在阿语下,做机型适配方面变得很容易,因为她是自适应的,你不用担心文本的对齐方式,如果必须要用match_parent的话,则需要加上  android:textAlignment="viewStart"  这个属性,否则阿语下文本对齐方式不对,另外 android:textDirection 属性来设置文本方向,根据需要进行设置。

另外针对华为,小米等国产手机,阿语下 ,TextView的单行显示省略号在左边的问题,只需要加上 gravity = “start” 属性即可把 省略号显示在右侧 ,PS一句大三星就不会有这个显示问题。。。

还有针对UI是720标准的设计,导致在2K屏部分界面 TextView 显示拥挤字换行的情况,处理方式很简单就是字号用sp,然后加上 android:autoSizeMaxTextSize、 android:autoSizeMinTextSize、 android:autoSizeTextType="uniform"、android:autoSizeStepGranularity="2sp",即可解决问题。

2、EditText 如果系统语言是非RTL布局的,如:中文系统,英文系统,而APP语言是阿语的情况下,输入数字会文本对齐是在最右边并且出现首尾都有光标,输入纯英文文本对齐又跑到了最左边并且光标只在尾部的情况,这时需要在布局文件内加上如下两个属性即可解决问题:

android:textDirection="anyRtl"
android:textAlignment="viewStart"

3、ViewPager  不支持RTL,不支持RTL,不支持RTL重要的事说三遍,不过这里给一个第三方的比较好用的替代控件RTLViewPager,它的Git地址:"com.booking:rtlviewpager:1.0.1",当然也可以自己手动实现,但你得足够强大哈!

其次说下图片,动画等反转:

1、有些图标(比如箭头)本身是有方向的,在RTL下也需要进行翻转,可以使用 android:autoMirrored 特性, 设置图片是否需要镜像反转,API Level 19(Android 4.4)才添加的属性。当然也可以让UI给出反转图片放到 drawable-ldrtl-xhdpi 目录下,不同分辨率放在不同目录下如:drawable-ldrtl-xxhdpi 。方便兼容低版本的API。

另外有语言文字的图片需要放到对应的语言资源文件夹下如:drawable-ar-xhdpi

2、动画的话,新建anim-ldrtl文件夹,将对应的动画进行反向处理。

最后说下RTL下常用的一些属性:

1、AS支持一键适配RTL,主要是针对Layout中XML文件里的

paddingLeft,paddingRight,layout_marginLeft,layout_marginRight,layout_alignParentLeft,layout_alignParentRight等属性使用paddingStart,paddingEnd,layout_marginStart,layout_marginEnd,layout_alignParentStart,layout_alignParentEnd替换。Start属性在LTR中对应Left,在RTL中对应Right,Edn则相反。在API 17开始支持,为了兼容低版本,可以同时有Left和Start。

2、android:layoutDirection  属性是改变布局方向的 ,RTL布局里,某些情况下可能个别页面需要从左到右显示,这时候可以添加该属性 android:layoutDirection = "ltr"。

注意:Android SDK在大于等于26时,即Android系统版本是8.0及8.0以上时,设置完 阿语 语区,通过 recreate()  的方式实现资源更新时,发现文字、图片等资源更新了但是布局没有反转。解决方法是进行 SDK 版本判断,然后进行代码设置布局方向,代码如下:

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        Resources res = getResources();
        Configuration conf = res.getConfiguration();
        getWindow().getDecorView().setLayoutDirection(conf.getLayoutDirection());
    }

PS:后续有遇到新东西会在补上,也欢迎各位拍砖修正哈!

你可能感兴趣的:(Android开发)