1

here で説明されているように、Android アプリに昼夜モードのオプションを追加しました。しかし、それを変更すると、言語が自動的に変更されます。

これが私の機能です

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());
}
4

1 に答える 1

1

ダーク モードを変更すると、アクティビティが既定の設定 (既定の言語) で再開されるため、ユーザーの言語を明示的に強制する必要があるという問題。

ただし、ダークモードを変更するたびに明示的に設定すると定型文になる可能性があり、言語を適用するためにアクティビティをもう一度再起動する必要がある場合もあります。

その代わりに、このカスタマイズされた をラップすることにより、アクティビティ コールバック 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());
}
于 2021-11-06T20:59:50.053 に答える