10

我的应用程序将来必须同时支持 RTL 和 LTR 语言,但现在只支持 RTLs。当我在每个布局中使用android:supportsRTL="true"withandroid:layoutDirection="end"时,NavigationView 和 Toolbar 以及其他一切都很好。

但唯一的问题是当用户将系统语言更改为 LTR 语言时,由于布局方向的改变,一切都会出错。

我需要什么:我必须设置supportsRTL:“true”。当用户在启动时选择“应用程序”语言而不是根据操作系统语言时,我需要以编程方式更改布局方向。

问题:有没有办法通过更改操作系统语言(而不是设置supportsRTL false)来防止布局方向的自动更改?

见下图:

支持RTL=

如果我android:supportRTL="false"为 RTL 设置和设计布局,工具栏和导航的菜单方向将是我的新麻烦。

见下图:

支持RTL=

4

3 回答 3

18

解决了。这只是一个可怕的小错误。

但是对于有类似问题的任何人,我都可以在 android 版本17 或更高版本上很好地工作,对于 17 之前的版本,我认为唯一的方法是为 RTL 和 LTR 使用单独的布局。

如果您必须android:supportsRTL="true"在清单中使用:
1. 如果您只想支持 RTL 语言,以防止根据操作系统语言改变方向:只需添加android:layoutDirection="rtl"到所有布局的父级(您也可以styles.xml 像这样使用主题)。或者创建一个子活动并从中扩展您的所有活动,然后将此代码放入它的 onCreate 中:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        Configuration configuration = getResources().getConfiguration();
            configuration.setLayoutDirection(new Locale("fa"));
        getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
    }

但在我看来,最好rtl在每个布局中设置方向,因为您可以在不运行应用程序的情况下看到它的外观。

2. 如果你想同时支持 RTL 和 LTR 语言,当然不要android:layoutDirection="rtl/ltr"在你的布局中使用,因为它的方向即使通过代码也不会改变任何方式。因为它会在rtl或方向上修复它ltr。所以你应该使用第二个。制作一个子活动并从中扩展您的所有活动,然后将此代码放入其中(仅作为示例):

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        Configuration configuration = getResources().getConfiguration();
        if (isSlectedLanguageRTL) {
            configuration.setLayoutDirection(new Locale("fa"));
        } else {
            configuration.setLayoutDirection(Locale.ENGLISH);
        }
        getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
    }

最后,对不起我的英语:)

于 2017-04-27T04:01:11.827 回答
1

在您的清单文件和应用程序标签内,您可以添加这两行。

<manifest>
    <application
        .
        .
        .
        android:supportsRtl="false"
        tools:replace="android:supportsRtl" //(replace libraries' Rtl support with ours)
        >
    </application>
</manifest>

一些库在它们的清单文件中支持 Rtl,所以如果你想使用这些库,你必须用你的替换它们的清单代码行。

这个问题可以解决:)

于 2018-05-06T06:41:54.497 回答
0

只需在您的App Theme Style中添加类似的内容:

<item name="android:layoutDirection">ltr</item>

这对我有用。

于 2021-05-31T05:57:07.137 回答