无法改变奥利奥的语言

时间:2017-12-26 11:51:21

标签: android locale android-8.0-oreo

我正在尝试在我的应用中使用阿拉伯语和英语。它在牛轧糖或以下运行的设备上运行良好。但它不适用于奥利奥设备。 API 26中是否有一些新的代码要求?我正在使用下面的代码。

public void changeLanguage(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);
    Configuration config = context.getResources().getConfiguration();
    config.setLocale(locale);
    context.createConfigurationContext(config);
    context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
}

我正在传递“en”和“ar”作为语言参数。

5 个答案:

答案 0 :(得分:3)

设置新Locale后,您应该重新启动Activity。您可以使用下一段代码执行它:

private void restartActivity() {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}

然后您的changeLanguage()方法会以下一个方式查看:

public void changeLanguage(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);
    Configuration config = context.getResources().getConfiguration();
    config.setLocale(locale);
    context.createConfigurationContext(config);
    context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());

    restartActivity();
}

答案 1 :(得分:1)

Locale locale = new Locale(lang);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        config.setLocale(locale);
    } else {
        config.locale = locale;
    }
    context.getApplicationContext().getResources().updateConfiguration(config,
            context.getApplicationContext().getResources().getDisplayMetrics());

这对我有用。

答案 2 :(得分:1)

我在一些研究之前和之后遇到同样的问题,我找到了一个解决方案。 创建自定义语言感知上下文包装器并附加到您的activity的attachBaseContext()方法中。

@SuppressWarnings("NewApi")
public static LanguageAwareContext newLanguageAwareContext(String targetLanguage, Context context) {
    Resources resources = context.getResources();
    Configuration configuration = resources.getConfiguration();

    Locale newLocale = new Locale(targetLanguage);

    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
        configuration.setLocale(newLocale);
        LocaleList.setDefault(new LocaleList(newLocale));

        context = context.createConfigurationContext(configuration);
    } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
        configuration.setLocale(newLocale);
        context = context.createConfigurationContext(configuration);
    } else {
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
    }

    return new LanguageAwareContext(context);
}

覆盖 attachBaseContext 方法,并使用自定义上下文包装器进行更改

@Override
protected void attachBaseContext(Context newBase) {
    newBase = LanguageAwareContext.newLanguageAwareContext("en",newBase);

    super.attachBaseContext(newBase);
}

答案 3 :(得分:1)

是的, Android Oreo 存在语言更改问题(阿拉伯语,乌尔都语和希伯来语的字符串和布局方向),我发现了可以帮助您解决问题的解决方案解决这个问题

在LanguageContextWrapper.java类中

 public static ContextWrapper wrap(Context context, String language) {
            Locale locale = new Locale(language);
            Locale.setDefault(locale);
            Resources resources = context.getResources();
            Configuration configuration = resources.getConfiguration();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                configuration.setLocale(locale);
                LocaleList localeList = new LocaleList(locale);
                LocaleList.setDefault(localeList);
                configuration.setLocales(localeList);
                configuration.setLayoutDirection(locale);
                context.createConfigurationContext(configuration);
            } else {
                configuration.locale = locale;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                    configuration.setLayoutDirection(locale);
                }
            }
            resources.updateConfiguration(configuration, resources.getDisplayMetrics());

        return new LanguageContextWrapper(context);
    }

在活动类别中覆盖以下方法

 override fun attachBaseContext(base: Context) {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
            super.attachBaseContext(LanguageContextWrapper.wrap(base, Locale.getDefault().language))
        } else {
            super.attachBaseContext(base)
        }
    }

更改语言后,我们必须重新创建活动,我们需要编写以下代码

fun recreateActivity(){
    if (Build.VERSION.SDK_INT in 26..27) {
                    if (Locale.getDefault().language == "ar" ||
                            Locale.getDefault().language == "iw" ||
                            Locale.getDefault().language == "ur")
                        window.decorView.layoutDirection = View.LAYOUT_DIRECTION_RTL
                    else
                        window.decorView.layoutDirection = View.LAYOUT_DIRECTION_LTR
                }
                recreate()

  }

答案 4 :(得分:1)

我最近遇到了与Oreo上的布局方向有关的问题。资源正在更新,但布局方向未更改。

下面的代码对我有用。

 public static void setRTLSupportIfRequired(AppCompatActivity activity) {
        if(getLanguageFromPrefs(activity).equals("ar")) {
            activity.getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
        }else{
            activity.getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
        }

    }

注意:以前我使用的是View.LAYOUT_DIRECTION_LOCALE,但不适用于Oreo