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

Disable auto change layout direction while using android:supportsRTL="true"

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

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

我需要什么:我必须设置支持RTL:"true"。当用户在启动时选择 "application" 语言而不是根据 OS 语言时,我需要以编程方式更改布局方向。

问题:有什么方法可以通过更改 OS 语言(而不是通过设置 supportsRTL false)来防止布局方向的自动更改?

见下图:

如果我设置android:supportRTL="false"只为RTL设计布局,Toolbar和Navigation的菜单方向将是我的新烦恼。

见下图:

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

但是对于遇到类似问题的任何人,我认为这在 android 版本 17 或更高版本 上非常有效,对于 17 之前的版本我认为唯一一种方法是为 RTL 和 LTR 使用单独的布局。

如果您必须在清单中使用 android:supportsRTL="true",那么:
1。如果你只想支持 RTL 语言 ,以防止根据 OS 语言改变方向: 只需将 android:layoutDirection="rtl" 添加到所有布局的父级即可(您也可以在 styles.xml like this 中使用主题)。 或者制作一个子 activity 并从中扩展所有 activity ,然后将此代码放入它的 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" 因为它的方向即使通过代码也不会改变任何方式。因为它会往rtlltr的方向固定。所以你应该使用第二个。制作一个子 activity 并从中扩展所有 activity ,然后将此代码放入其中(仅作为示例):

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

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

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

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

Some libraries have support Rtl in their manifest file so if you want to use those libraries you must replace their manifest line of code with yours.

这个问题可以解决:)

只需在您的应用主题样式中添加类似这样的内容:

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

这对我有用。