当我更改夜间模式时,语言会自动更改
The language changes automatically when I change the night mode
我在我的 android 应用程序中添加了 day/night 模式选项作为 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());
}
当你改变深色模式时,activity以默认设置(默认语言)重新启动的问题,所以你需要明确强制用户的语言。
但是每次更改暗模式时明确设置可能是样板文件,这也可能需要再重新启动 activity 才能应用该语言。
相反,您可以使用自定义的 ContextWrapper
,您可以在 attachBaseContext()
activity 回调中应用首选语言,方法是包装此自定义的ContextWrapper
:
自定义上下文包装器:
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);
}
}
覆盖 activity 中的 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());
}
我在我的 android 应用程序中添加了 day/night 模式选项作为 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());
}
当你改变深色模式时,activity以默认设置(默认语言)重新启动的问题,所以你需要明确强制用户的语言。
但是每次更改暗模式时明确设置可能是样板文件,这也可能需要再重新启动 activity 才能应用该语言。
相反,您可以使用自定义的 ContextWrapper
,您可以在 attachBaseContext()
activity 回调中应用首选语言,方法是包装此自定义的ContextWrapper
:
自定义上下文包装器:
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);
}
}
覆盖 activity 中的 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());
}