使用 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"
,因为它的方向即使通过代码也不会改变。因为它将在rtl
或ltr
的方向上修复它。所以你应该使用第二个。制作一个子活动并从中扩展您的所有活动,然后将这段代码放入其中(仅作为示例):
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" 时禁用自动更改布局方向的主要内容,如果未能解决你的问题,请参考以下文章