Android:以编程方式更改整个应用布局方向

问题描述 投票:26回答:6

如何将整个应用布局方向更改为RTL?我正在编写一个应用程序,用户必须在首次启动时选择它的语言,并且布局应根据用户选择更改为RTL或保持LTR。我曾经为每个布局添加android:supportsRtl="true"AndroidManifestandroid:layoutDirection="rtl",但这种方法有一些问题,如下所示:

一个问题是,当我将方向更改为RTL时,ActionBar主页图标或导航按钮(当启用了主页时)仍保持LRT并向右移动。

我也试图以编程方式改变方向,结果是一样的:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
            getWindows().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
        }

enter image description here

有没有办法强制所有活动一次成为RTL,或者我们应该分别在每项活动中设定方向?

android android-actionbar toolbar right-to-left direction
6个回答
40
投票

在应用程序的minSdk> = 17时,您可以使用这段代码。

我使用fa作为Farsi,你可以使用其他rtl语言。

Configuration configuration = getResources().getConfiguration();
configuration.setLayoutDirection(new Locale("fa"));
getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());

3
投票

如果您想更改应用中的语言并更改活动布局上的视图和资源中的路线,请尝试以下代码:

// set Persian language in the app
setLanguage(context, "fa");

public void setLanguage(Context c, String lang) {
    Locale localeNew = new Locale(lang);
    Locale.setDefault(localeNew);

    Resources res = c.getResources();
    Configuration newConfig = new Configuration(res.getConfiguration());
    newConfig.locale = localeNew;
    newConfig.setLayoutDirection(localeNew);
    res.updateConfiguration(newConfig, res.getDisplayMetrics());

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        newConfig.setLocale(localeNew);
        c.createConfigurationContext(newConfig);
    }
}

此外,更改语言后,您需要更改活动布局上已创建视图的方向。您可以使用以下代码执行此操作:

if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL) {
        view.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
} else {
        view.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
}

2
投票

更改整个布局

 LinearLayout linrtl=(LinearLayout)findViewById(R.id.linrtl);
 linrtl.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

0
投票

后退按钮保持在LTR模式,因为它只有一个资源,即指向左侧的箭头。您需要指定一个新的资源文件夹,例如drawable-ldrtl-hdpi,并将相同的图标放在此文件夹中。


0
投票

我也有这个问题,我发现如果你的视图的宽度设置为MATCH_PARENT,你应该在LTR模型中用Gravity.LEFT设置视图的重力,并在RTL模型中用Gravity.RIGHT设置视图的重力。


0
投票

以下代码将起作用:

    Resources your_resource = context.getResources();

    Configuration config = your_resource.getConfiguration();
    config.locale = locale;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        config.setLayoutDirection(locale);
    }

locale是Locale的对象

© www.soinside.com 2019 - 2024. All rights reserved.