【问题标题】:programmatically changing app language and maintain language with SharedPreferences以编程方式更改应用程序语言并使用 SharedPreferences 维护语言
【发布时间】:2020-06-14 18:17:36
【问题描述】:

我正在尝试在导航抽屉列表中单击语言名称时以编程方式更改应用程序语言。语言发生了变化,但当应用程序关闭时我无法维护。 这是我的setLocal 方法

private void setLocale(String lang) {
        Locale locale = new Locale(lang);
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());

        SharedPreferences.Editor editor = getSharedPreferences(SHARED_PREFS,MODE_PRIVATE).edit();
        editor.putString(MY_LANG,lang);
        editor.apply();
    }

当我想像这样更改语言时,我会调用此方法

              if (id == R.id.ar_lang){
                    setLocale("ar");
                    recreate();
                }
                if (id == R.id.eng_lang){
                    setLocale("en");
                    recreate();
                }

我在 onCreate 中调用这个方法来获取存储的语言,但是它不起作用。

public void loadLocale(){
        SharedPreferences prefs = getSharedPreferences(SHARED_PREFS, Activity.MODE_PRIVATE);
        String languages =  prefs.getString(MY_LANG,"");
        setLocale(languages);
    }

【问题讨论】:

    标签: java android sharedpreferences


    【解决方案1】:

    我正在使用https://stackoverflow.com/a/34675427/519334 在运行时更改应用语言。

    我在 onCreate 中调用这个方法来获取存储的语言,但是它不起作用。

    我的解决方案只有在语言设置完成后才有效 (loadLocale())之前调用 super.OnCreate()

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        loadLocale();
        super.onCreate(savedInstanceState);
        ... initialize
    }
    

    【讨论】:

      【解决方案2】:

      您应该将带有新配置的上下文传递给您的活动

      使用这个LocaleHelper(用 Kotlin 编写,但你也可以用 Java 自己编写)

      然后在你的活动中调用这个方法

      override fun attachBaseContext(newBase: Context?) {
          super.attachBaseContext(LocaleHelper.onAttach(newBase!!))
      }
      
      override fun applyOverrideConfiguration(overrideConfiguration: Configuration?) 
      {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP 
                && Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) {
              // update overrideConfiguration with your locale
              overrideConfiguration?.setLocale(LocaleHelper.getCurrentLocale(this))
              overrideConfiguration?.setLayoutDirection(LocaleHelper.getCurrentLocale(this))
          }
          super.applyOverrideConfiguration(overrideConfiguration)
      }
      

      【讨论】:

        猜你喜欢
        • 2012-03-01
        • 2018-08-09
        • 2012-01-13
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多