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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android:以编程方式更改整个应用布局方向相关的知识,希望对你有一定的参考价值。

如何将整个应用布局方向更改为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,或者我们应该分别在每项活动中设定方向?

答案

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

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

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

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

// 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);
}
另一答案

更改整个布局

 LinearLayout linrtl=(LinearLayout)findViewById(R.id.linrtl);
 linrtl.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
另一答案

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

另一答案

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

另一答案

以下代码将起作用:

    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的对象

以上是关于Android:以编程方式更改整个应用布局方向的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式更改整个应用程序中的字体大小,Android?

Android:当布局已经包含按钮时,如何以编程方式覆盖整个布局?

在recyclerview android中以编程方式更改布局管理器

Android:根据用户设置以编程方式更改 SourceSet

为相对布局android创建和设置边距编程

android RelativeLayout以编程方式更改高度