在使用android:supportsRTL="true"的同时禁用自动更改布局方向。

10

我的应用未来必须支持RTL和LTR两种语言,但现在只支持RTL。当我在每个布局中使用android:supportsRTL="true"android:layoutDirection="end"时,NavigationView和Toolbar等所有内容都没问题。

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

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

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

参见下图:

supportsRTL="true", RTL vs LTR

如果我设置android:supportRTL="false"并仅设计RTL布局,则Toolbar和导航菜单的方向将成为我的新问题。

参见下图:

supportsRTL="false"

3个回答

19

问题已解决。只是一个小错误。

但对于像我遇到的这种问题,针对 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",因为它的方向无论如何都不会改变,甚至通过代码也无法更改。因此,你应该使用第二种方法,创建一个子活动并从它扩展所有的活动,然后将此代码放入其中(这只是一个示例):

    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());
    }

最后,对于我的英语表示抱歉 :)


你确定这完全可行吗?我想像你一样用它来处理波斯语,这样可以吗? - Yasin Hajilou
这个解决方案对我有效,谢谢。 - S_i_l_e_n_t C_o_d_e_r

1
在您的清单文件中,在应用程序标签内,您可以添加这两行代码。
<manifest>
    <application
        .
        .
        .
        android:supportsRtl="false"
        tools:replace="android:supportsRtl" //(replace libraries' Rtl support with ours)
        >
    </application>
</manifest>

一些库在其清单文件中支持Rtl,因此如果您想使用这些库,必须用您自己的清单代码替换它们的清单代码行。

这个问题可以解决 :)


0
只需在您的App主题样式中添加类似以下内容即可:
<item name="android:layoutDirection">ltr</item>

这对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接