注意:应用程序支持RTL的布局需要在AndroidManifest.xml的 <application> 中,添加 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:后续有遇到新东西会在补上,也欢迎各位拍砖修正哈!

注意:应用程序支持RTL的布局需要在AndroidManifest.xml的&lt;application&gt;中,添加android:supportsRtl=true。该声明代表您的应用程序是否支持从右到左(RTL)布局。targetSdkVersion设置为17或更高,则系统将激活并使用各种RTL API,以便您的应用程序可以显示RTL布局。如果设置为false或者targetSdkVers...
#### 是在这里托管的项目的扩展。 由于似乎不支持乌尔都语,波斯语,阿拉伯语等RTL脚本,因此旨在支持这些语言。 =======简单的Android全面论证概述 这很简单。 您要做的就是获取库本身,并将其添加到您的Android项目中。 看起来非常准确和整洁。 可能会出现一些小问题,但是如果用户在Github上发布他们的问题,则很容易解决。 要使用它,您要做的就是在项目中包含TextViewEx.java和TextJustifyUtils.java 。 然后,您可以像使用内置TextView 。 若要提高大型TextView的性能,必须启用优化。 为此,必须使用setDrawingCacheEnabled(bool) 。 使用此方法可以提高速度,但同时也需要更多的内存。 < ScrollView xmlns : android = " http://schemas.androi
不再支持该库。 我们建议使用进行将来的开发。 RtlViewPager RtlViewPager构建在作为ViewPager一部分提供的。 它扩展了ViewPager的功能,以便当布局方向从右到左时,页面会相应滚动。 RtlViewPager完全支持数据集更改,与标签栏的互操作以及屏幕旋转和其他配置更改时的保存和还原状态。 尽管自版本4.2起,RTL支持已作为Android的一部分提供,但支持库中的ViewPager实现不存在。 请注意,该库不再受支持, ,它将不再通过jcenter可用。 dependencies { implementation ' androidx.viewpager:viewpager:1.0.0 ' implementation ' com.duolingo.open:rtl-viewpager:2.0.0 '
bug现象: 在“٩(·ω·) و”这个表情后通过StringBuilder拼接的文字会显示在表情内部,例如拼接“2015”后TextView控件中显示为“٩(·ω·) و2015” bug原因排查: Step1:怀疑是工程师调用append方法错误,但通过debug调试查看String的char[]值正常 Step2:怀疑是“و”这个特殊字符引起的问题,删除后显示正常
1.2 创建Android项目 一个Android项目包含了生产Android应用所需要的全部源代码文件,使用Android SDK Tools可以很容易地创建一个新的Android项目,同时创建好项目默认的目录和文件。 本小节介绍如何使用Eclipse(已安装ADT插件)或SDK Tools命令行来创建一个新的项目。
private ViewGroup getMoveViewGroup() { ViewGroup moveViewGroup = (ViewGroup) getWindow().getDecorView(); LinearLayout moveLinearLayout = new LinearLayout(this); LinearLayout.La
//全屏显示 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); WindowManager.LayoutParams lp = getWindow().getAttributes(); if (next_node_addr != 8'hFF) begin current_addr <= next_node_addr; end else if (down_node_addr != 8'hFF) begin current_addr <= down_node_addr; assign next_addr = node_inst.next; assign down_addr = node_inst.down; endmodule 这个实现包含 `Node` 模块和 `TwoDLinkedList` 模块。 `Node` 模块是链表节点的实现,包含一个数据 `data`,一个指向下一个节点的地址 `next`,和一个指向下一行的节点的地址 `down`。 `TwoDLinkedList` 模块是二维链表的实现,包含一个当前节点地址 `current_addr`,一个指向下一个节点的地址 `next_node_addr`,和一个指向下一行的节点的地址 `down_node_addr`。它实例化了一个 `Node` 模块,并将输入输出连接到 `Node` 模块的端口。 `TwoDLinkedList` 模块通过 `assign` 语句将 `Node` 模块的 `next` 和 `down` 端口的值输出,同时根据 `next_node_addr` 和 `down_node_addr` 的值更新 `current_addr`。
南风向北~: database.execSQL("CREATE TABLE IF NOT EXISTS 'UserModel ' ('id' INTEGER PRIMARY KEY autoincrement, 'uid' INTEGER, 'name' TEXT, 'age' INTEGER, 'isMarry' INTEGER)"); 请问id是自增的,为啥没有加not null ?