【问题标题】:The language changes automatically when I change the night mode更改夜间模式时语言会自动更改
【发布时间】:2021-12-20 06:19:06
【问题描述】:

我在我的 Android 应用程序中添加了日/夜模式选项为explained here。但是当我改变它时,语言会自动改变。

这是我的功能

public void enableDarkMode(boolean enable){
    Log.d(""+ this.TAG, "Dark Mode = "+enable);
    this.editorDarkMode.putBoolean(IS_DARK_MODE_ON, enable);
    this.editorDarkMode.commit();
    if (enable){
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    }else {
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    }
}

我搜索了很多,但还没有找到任何解决方案。

Edit1:这就是我存储语言的方式。

public void setLanguage(String lang){
    this.editorLang.putString("Language", ""+lang);
    this.editorLang.commit();
    Locale locale = new Locale(""+ lang);
    Locale.setDefault(locale);
    Configuration configuration = new Configuration();
    configuration.locale = locale;
    this.context.getResources().updateConfiguration(configuration,this.context.getResources().getDisplayMetrics());
}

【问题讨论】:

  • 如何存储用户的首选语言?
  • 我编辑了我的问题

标签: java android locale android-night-mode


【解决方案1】:

当你更改暗模式时,activity以默认设置(默认语言)重启的问题,所以你需要显式强制用户的语言。

但是每次更改暗模式时都明确设置可能是样板,这也可能需要再次重新启动活动以应用语言。

取而代之的是,您可以使用自定义的ContextWrapper,通过包装此自定义的ContextWrapper,您可以在attachBaseContext() 活动回调中在应用程序的开头应用首选语言:

自定义上下文包装器:

public class MyContextWrapper extends ContextWrapper {

    public MyContextWrapper(Context base) {
        super(base);
    }

    public static ContextWrapper wrap(Context context, String language) {
        Configuration config = context.getResources().getConfiguration();
        Locale sysLocale;
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
            sysLocale = getSystemLocale(config);
        } else {
            sysLocale = getSystemLocaleLegacy(config);
        }
        if (!language.equals("") && !sysLocale.getLanguage().equals(language)) {
            Locale locale = new Locale(language);
            Locale.setDefault(locale);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                setSystemLocale(config, locale);
            } else {
                setSystemLocaleLegacy(config, locale);
            }

        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            context = context.createConfigurationContext(config);
        } else {
            context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
        }
        return new MyContextWrapper(context);
    }

    public static Locale getSystemLocaleLegacy(Configuration config) {
        return config.locale;
    }

    @TargetApi(Build.VERSION_CODES.N)
    public static Locale getSystemLocale(Configuration config) {
        return config.getLocales().get(0);
    }

    public static void setSystemLocaleLegacy(Configuration config, Locale locale) {
        config.locale = locale;
    }

    @TargetApi(Build.VERSION_CODES.N)
    public static void setSystemLocale(Configuration config, Locale locale) {
        config.setLocale(locale);
    }
}

在活动中覆盖attachBaseContext()

@Override
protected void attachBaseContext(Context context) {
    sharedPreferences = context.getSharedPreferences("prefs", MODE_PRIVATE); // adjust the name of the SharedPreference to yours
    String language = sharedPreferences.getString("Language", "en");
    super.attachBaseContext(MyContextWrapper.wrap(context, language));
    Locale locale = new Locale(language);
    Resources resources = getBaseContext().getResources();
    Configuration conf = resources.getConfiguration();
    conf.locale = locale;
    resources.updateConfiguration(conf, resources.getDisplayMetrics());
}

【讨论】:

  • Thnx 先生,它工作正常,但是当我更改夜间模式时,我遇到了另一个问题,它仅在一个活动中更改!!
  • @AhmedLaggoun 您是否将主题应用于单个活动?你能分享一下style.xml和清单文件吗
  • 这个问题你也可以看看stackoverflow.com/questions/66149667/…
  • 谢谢先生您的注意,这是我的问题。我将android:configChanges="uiMode" 添加到清单中的 application 中,这样就完成了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
相关资源
最近更新 更多