代码之家  ›  专栏  ›  技术社区  ›  Rashid Bilal

主题更改时Android应用程序区域设置更改回英语

  •  0
  • Rashid Bilal  · 技术社区  · 5 月前

    摘要:当在“选择语言”、“历史记录”和“更改应用程序语言”屏幕上更改主题时,标题会从所选语言切换到英语,导致语言设置不一致。 复制步骤: 打开应用程序并将语言设置为非英语语言(例如西班牙语、法语等)。 导航到以下任何屏幕: 选择语言 历史 更改应用程序语言 更改主题(例如,在亮模式和暗模式之间切换)。 请注意,主题更改后,这些屏幕上的标题从所选语言更改为英语。

     private void updateLocale(String langCode) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU){
                LocaleListCompat appLocale = LocaleListCompat.forLanguageTags(langCode);
                AppCompatDelegate.setApplicationLocales(appLocale);
            } else {
                Locale locale = new Locale(langCode);
                Locale.setDefault(locale);
                Configuration config = new Configuration();
                config.setLocale(locale);
             getResources().updateConfiguration(config,getResources().getDisplayMetrics());
            }
        }
    
    1 回复  |  直到 5 月前
        1
  •  1
  •   Mohammad Misbah    5 月前

    为了确保跨主题更改的区域设置持久性, 安卓13+(TIRAMISU) 使用AppCompatDelegate.setApplicationLocales(),而 安卓13之前 依赖于更新配置。第一, 存储所选语言 在共享首选项中:

    SharedPreferences prefs = getSharedPreferences("Settings", MODE_PRIVATE);
    prefs.edit().putString("Lang", langCode).apply();
    

    In updateLocale() ,应用基于Android版本的区域设置:

    private void updateLocale(String langCode) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            LocaleListCompat appLocale = LocaleListCompat.forLanguageTags(langCode);
            AppCompatDelegate.setApplicationLocales(appLocale);
        } else {
            Locale locale = new Locale(langCode);
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.setLocale(locale);
            getResources().updateConfiguration(config, getResources().getDisplayMetrics());
        }
    }
    

    为确保活动重新启动时恢复区域设置,请覆盖 attachBaseContext() 在里面 BaseActivity :

    @Override
    protected void attachBaseContext(Context newBase) {
        Locale locale = new Locale(getSavedLangCode(newBase)); 
        Configuration config = newBase.getResources().getConfiguration();
        config.setLocale(locale);
        super.attachBaseContext(newBase.createConfigurationContext(config));
    }
    

    最后在主题改变之后, 武力娱乐 要正确应用区域设置和主题更新:

    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    recreate();
    

    通过结合这些方法,该应用程序在主题更改中保持所选语言,而不会出现不一致