使用 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"
因为它的方向即使通过代码也不会改变任何方式。因为它会往rtl
或ltr
的方向固定。所以你应该使用第二个。制作一个子 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>
这对我有用。
我的应用程序将来必须同时支持 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"
因为它的方向即使通过代码也不会改变任何方式。因为它会往rtl
或ltr
的方向固定。所以你应该使用第二个。制作一个子 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>
这对我有用。