ダーク モードを変更すると、アクティビティが既定の設定 (既定の言語) で再開されるため、ユーザーの言語を明示的に強制する必要があるという問題。
ただし、ダークモードを変更するたびに明示的に設定すると定型文になる可能性があり、言語を適用するためにアクティビティをもう一度再起動する必要がある場合もあります。
その代わりに、このカスタマイズされた をラップすることにより、アクティビティ コールバック ContextWrapper
でアプリの最初に優先言語を適用できるカスタマイズされた を使用できます。attachBaseContext()
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);
}
}
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());
}