8

从 android 4.2 开始,完全支持 RTL 语言。
Start并且End可以替换LeftRight定义布局,但 android 4.1 及更早版本不支持开始和结束。
要为两个布局方向仅使用一个 xml,我们可以同时使用startandleftendandright来实现逆向兼容性。
举个例子 :

<View
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    />

使用 android 4.3,设备仅使用startend参数并忽略left以及right两者都定义的地方。

但是对于 android 4.2.2设备使用这两个参数!

我必须使用layout-v17文件夹来复制带有startend参数的每个布局。
还有其他解决方案吗?

4

2 回答 2

3

好吧,我不知道是否有任何官方解决方法,所以我实施了一个 hack。

我将此添加到gradle.build文件的末尾

String targetRTLDir = "res/layout-ldrtl"
task copyTask(type: Copy) {
    delete fileTree(dir: targetRTLDir)

    from 'res/layout'
    into targetRTLDir

    filter { String line -> line.replaceAll('Right', 'RTL_R') }
    filter { String line -> line.replaceAll('Left', 'Right') }
    filter { String line -> line.replaceAll('RTL_R', 'Left') }
    filter { String line -> line.replaceAll('android:layout_gravity="right"', 'android:layout_gravity="rtl_r"') }
    filter { String line -> line.replaceAll('android:layout_gravity="left"', 'android:layout_gravity="right"') }
    filter { String line -> line.replaceAll('android:layout_gravity="rtl_r"', 'android:layout_gravity="left"') }
    filter { String line -> line.replaceAll('android:gravity="right"', 'android:gravity="rtl_r"') }
    filter { String line -> line.replaceAll('android:gravity="left"', 'android:gravity="right"') }
    filter { String line -> line.replaceAll('android:gravity="rtl_r"', 'android:gravity="left"') }
    filter { String line -> line.replaceAll('android:gravity="start"', 'android:gravity="right"') }
    filter { String line -> line.replaceAll('android:gravity="end"', 'android:gravity="left"') }
}

preBuild.dependsOn('copyTask')

它所做的只是将所有文件从layoutto复制layout-ldrtl并交换所有leftright.

如果需要,您也可以替换 allleftrighttostart并将end其放入layout-v17文件夹中,但我发现这更好用,因为android:gravity="start"不起作用!

我是新手Gradle,所以如果可以使用更简单的脚本来完成,请原谅:)

于 2015-02-26T12:37:55.733 回答
1

这篇文章很旧,但仍然有效。

我有同样的问题。我发现只有当视图被包裹在相对布局中时才会出现这个问题。在这种情况下,将 alignparentright 与 alignparentend 结合使用会产生全宽视图,因为它同时使用 end 和 right 参数。当您删除 relativelayout 并将其替换为 linearlayout 时,仅 alignparentend 参数不能再使用,但您可以使用重力。Android 应用程序本身确保 RTL ui 被镜像

于 2015-11-15T21:23:46.620 回答