设置android:supportsRtl="false"后布局仍翻转,如何阻止?
我明白你现在的困扰——明明已经在Manifest里设置了android:supportsRtl="false",但切换到阿拉伯语这类RTL语言时布局还是会自动翻转,不管系统语言或者API级别,就想彻底禁用这个行为对吧?别着急,我给你几个经过验证的解决办法:
1. 全局锁定布局方向(推荐)
如果想让整个应用所有页面都保持从左到右的布局,最省心的方式是在自定义Application类里强制设置布局方向:
首先创建一个自定义Application类(如果还没有的话),然后在onCreate()方法中添加这段代码:
@Override public void onCreate() { super.onCreate(); // 强制将全局布局方向设为从左到右 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { Configuration config = getResources().getConfiguration(); config.setLayoutDirection(View.LAYOUT_DIRECTION_LTR); getResources().updateConfiguration(config, getResources().getDisplayMetrics()); } }
记得在AndroidManifest.xml里把Application的android:name指向这个自定义类,这样启动应用时就会全局生效,不管系统切换到什么语言,布局都不会翻转。
2. 为单个Activity锁定方向
如果不需要全局设置,只想让特定的Activity保持LTR布局,可以在对应Activity的onCreate()方法(调用setContentView()之前)添加这段代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_LTR); } setContentView(R.layout.your_activity_layout); }
3. 在布局文件中显式指定方向
对于需要精细控制的单个布局,可以直接在布局的根视图上添加android:layoutDirection="ltr"属性,强制该布局保持从左到右:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layoutDirection="ltr"> <!-- 你的布局内容 --> </RelativeLayout>
这个方法适合布局数量不多的场景,能精准控制每个布局的方向。
补充说明
为什么设置了android:supportsRtl="false"还是会翻转?其实这个属性只是告诉系统“我的应用没有为RTL语言做适配”,但在较高API级别下,系统仍然会自动尝试翻转未明确指定方向的布局。上面的方法从全局、Activity、布局三个层面彻底锁定了LTR方向,就能解决这个问题啦。
内容的提问来源于stack exchange,提问作者Mahmoud Asran

