首页 > 解决方案 > createConfigurationContext 无法在 API 级别 <26 上以编程方式更改语言

问题描述

我已经阅读了有关在运行时更改应用内语言的所有内容。目前一切都适用于 API 26+27+28+29(是的,我已经测试了所有这些),并开始在 API 25 及以下版本中断。现在我唯一知道的 API 级别 26 中发生的事情是应用程序和活动在默认情况下不再共享相同的资源(也称为顶级资源)。而且资源的 updateConfiguration 也被弃用,取而代之的是 API 25 中的 createConfigurationContext

然而,这真的给了我零线索。

这是我的代码:

public class BaseApp extends MultiDexApplication { //for MinSDK < 21, otherwise "extends Application"

@Override
public void onCreate() {
    LocaleHelper.updateResources(this);
    super.onCreate();
}

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(LocaleHelper.updateResources(base));
    MultiDex.install(this); /* Needed as per (@link MultiDexApplication) */

}

@Override
public void onConfigurationChanged(Configuration config) {
    super.onConfigurationChanged(config);
    LocaleHelper.updateResources(this);
}

基础活动:

public abstract class BaseActivity extends AppCompatActivity {

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(LocaleHelper.updateResources(base));
}

助手类:

class LocaleHelper {

static Context updateResources(Context context) {
    Resources resources = context.getResources();
    Configuration config = new Configuration(resources.getConfiguration());
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    String lang = preferences.getString(Constants.PREF_KEY_LOCALE_OVERRIDE, Constants.PREF_VALUE_LOCALE_SYSTEM);
    Locale locale = new Locale(lang);

    if (Build.VERSION.SDK_INT >= 17) {
        config.setLocale(locale);
        context = context.createConfigurationContext(config);
    } else {
        config.locale = locale;
        resources.updateConfiguration(config, resources.getDisplayMetrics());
    }
    return context;
}

标签: androidconfigurationlocaleandroid-resourcesandroid-context

解决方案


这是 AndroidX 的 AppCompat 实现的一个已知错误。该错误在版本 1.0.0 中:'androidx.appcompat:appcompat:1.1.0' 我确认它在库的版本 1.2.0 中有效。


推荐阅读