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

时间:2017-04-25 19:19:45

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

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

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

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

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

见下图:

supportsRTL="true", RTL vs LTR

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

见下图:

supportsRTL="false"

3 个答案:

答案 0 :(得分:9)

<强>解决即可。这只是一个小小的可怕错误。

但对于那些有类似问题的人来说,我在Android版本 17或以上上工作得非常好,对于前17版我认为唯一的方法是使用单独的布局进行RTL和LTR。

如果你必须在清单中使用android:supportsRTL="true",那么:
1。如果您只想支持RTL语言,请防止根据操作系统语言更改方向: 只需将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());
    }

最后,抱歉我的英语:)

答案 1 :(得分:0)

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

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

有些库在其清单文件中支持Rtl,以便您可以使用   要使用这些库,您必须替换它们的清单代码行   和你的一起。

这个问题可以解决:)

答案 2 :(得分:0)

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

  Row(
                          children: [
                            Expanded(
                              child:DropDownWidget(
                                list: ["Yes","No"],
                                data: patientConsent,
                                hint: getTranslated(context, "select"),
                                heading: getTranslated(context, "patient_consent"),

                              ),
                            ),
                          ],
                        ),
                        
                         CustomFromField(
                          heading: getTranslated(context, "sample_id")

                        -----

这对我有用。