【问题标题】:Disable auto change layout direction while using android:supportsRTL="true"使用 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 设计布局,工具栏和导航的菜单方向将是我的新麻烦。

见下图:

【问题讨论】:

    标签: android android-layout multiple-languages rtl-language


    【解决方案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>
      

      这对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-15
        • 2014-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多