Changing language in run time with Preferences [android]

寵の児 提交于 2019-12-01 14:05:11
Gabriella Angelova

After your language is changed, you need to restart your current activity if you want to see it with changed language too. For example like this:

private void restartActivity() {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}

Take a look at the best answer here How to refresh activity after changing language (Locale) inside application

In the end I made it work without the use of fragments. So there are some deprecated methods in here, I tried with fragments too, but no full succes (yet). This code refreshes SettingsActivity after a change always, and MainActivity updates itself too correctly.

MainActivity

public class MainActivity extends Activity {

public static final String KEY_PREF_LANGUAGE = "pref_language";
public String languagePref_ID;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
    languagePref_ID = sharedPref.getString(KEY_PREF_LANGUAGE, "2");
    switch (languagePref_ID) {
        case "1":
            Locale localeEN = new Locale("en_US");
            setLocaleOnCreate(localeEN);
            break;
        case "2":
            Locale localeHU = new Locale("hu_HU");
            setLocaleOnCreate(localeHU);
            break;

    }
    setContentView(R.layout.activity_main);
    ....
}
@Override
protected void onResume() {
    super.onResume();
    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
    String languagePref_ID_RES = sharedPref.getString(KEY_PREF_LANGUAGE, "2");
    if(!languagePref_ID.equals(languagePref_ID_RES)){
        languagePref_ID_RES = languagePref_ID;
        switch (languagePref_ID_RES) {
            case "1":
                Locale localeEN = new Locale("en_US");
                setLocale(localeEN);
                break;
            case "2":
                Locale localeHU = new Locale("hu_HU");
                setLocale(localeHU);
                break;

        }
    }
}
    public void setLocaleOnCreate(Locale locale) {
    Locale.setDefault(locale);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = locale;
    res.updateConfiguration(conf, dm);
}

public void setLocale(Locale locale) {
    Locale.setDefault(locale);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = locale;
    res.updateConfiguration(conf, dm);
    recreate();
    //finish();
    //startActivity(getIntent());
}
  ....

    public void startSettingsActivity(View view) {
    Intent intent = new Intent(this, SettingsActivity.class);
    startActivity(intent);
  }
}

SettingsActivity

public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

public static final String KEY_PREF_LANGUAGE = "pref_language";
public String languagePref_ID;

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


    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.OnSharedPreferenceChangeListener listener =
            new SharedPreferences.OnSharedPreferenceChangeListener() {
                public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
                    if (key.equals(KEY_PREF_LANGUAGE)) {
                        languagePref_ID = prefs.getString(SettingsActivity.KEY_PREF_LANGUAGE, "2");
                        switch (languagePref_ID) {
                            case "1":
                                Locale localeEN = new Locale("en_US");
                                setLocale(localeEN);
                                break;
                            case "2":
                                Locale localeHU = new Locale("hu_HU");
                                setLocale(localeHU);
                                break;
                        }
                    }
                }
            };
    sharedPref.registerOnSharedPreferenceChangeListener(listener);
    addPreferencesFromResource(R.xml.preferences);
}

@Override
protected void onResume() {
    super.onResume();
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
    super.onPause();
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    if (key.equals(KEY_PREF_LANGUAGE)) {
        languagePref_ID = sharedPreferences.getString(SettingsActivity.KEY_PREF_LANGUAGE, "2");
        switch (languagePref_ID) {
            case "1":
                Locale localeEN = new Locale("en_US");
                setLocale(localeEN);
                break;
            case "2":
                Locale localeHU = new Locale("hu_HU");
                setLocale(localeHU);
                break;
        }
    }
}

public void setLocale(Locale locale) {
    Locale.setDefault(locale);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = locale;
    res.updateConfiguration(conf, dm);
    recreate();
 }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!