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

Posted

技术标签:

【中文标题】使用 android:supportsRTL="true" 时禁用自动更改布局方向【英文标题】:Disable auto change layout direction while using android:supportsRTL="true" 【发布时间】:2017-09-22 23:19:13 【问题描述】:

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

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

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

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

见下图:

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

见下图:

【问题讨论】:

【参考方案1】:

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

但对于任何有类似问题的人,我认为这将在 android 版本 17 或更高版本上运行得非常好,对于 17 之前的版本,我认为唯一的方法是为 RTL 和LTR。

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

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

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

【讨论】:

你确定这完全有效吗?我想像你一样将它用于波斯语,这样可以吗? 这个解决方案对我有用,谢谢。【参考方案2】:

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

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

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

这个问题可以解决:)

【讨论】:

【参考方案3】:

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

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

这对我有用。

【讨论】:

以上是关于使用 android:supportsRTL="true" 时禁用自动更改布局方向的主要内容,如果未能解决你的问题,请参考以下文章

android设计的布局在阿拉伯语下界面错乱的解决方法

Android ActionBar错误的布局方向

Android Studio 基础知识

百度地图定位签到功能

如何在 Android 清单应用程序中添加多个“工具:替换”?

自定义工具栏不在那里