使用偏好设置在运行时更改语言[android] [英] Changing language in run time with Preferences [android]

查看:69
本文介绍了使用偏好设置在运行时更改语言[android]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为此,我读了几次官方指南,并且许多其他内容,例如本网站上的问题,但我无法100%完成我的工作

I read a few times the official guide for this, and many other stuff, like questions on this site but I cant make mine work 100%

截至目前,如果我在列表首选项中更改语言,则活动(SettingsActivity)不会自动更新(例如20次中的1次,某种程度上它会更新,不知道为什么).当我按下后退按钮后,我的MainActivity也没有更新.但是我所有其他活动始终显示正确的语言,并且如果我重新启动该应用程序,则可以回到SettingsActivity,与MainActivity一样,也可以.

As of right now if I change the language in my list preference, the activity (SettingsActivity) will not update itself (like 1 out of 20 times, somehow it will, no idea why). After I press the back button, my MainActivity did not update either. But all my other activitys always show the correct language, and if I go back to the SettingsActivity it will be okay, same with the MainActivity, if I restart the app.

相关部分:

MainActivity:

public class MainActivity extends Activity {

public static final String KEY_PREF_LANGUAGE = "pref_language";

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
}

@Override
protected void onResume() {
    super.onResume();
    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

    String languagePref_ID = sharedPref.getString(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();
    //finish();
    //startActivity(getIntent());
    //if these are not commented, main activity wont show at start at all
}

SettingsActivity

public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

public static final String KEY_PREF_LANGUAGE = "pref_language";

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

    getFragmentManager().beginTransaction()
            .replace(android.R.id.content, new SettingsFragment())
            .commit();
    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.OnSharedPreferenceChangeListener listener =
            new SharedPreferences.OnSharedPreferenceChangeListener() {
                public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
                    if (key.equals(KEY_PREF_LANGUAGE)) {
                        String languagePref_ID = prefs.getString(SettingsActivity.KEY_PREF_LANGUAGE, "");
                        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);
}


public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    if (key.equals(KEY_PREF_LANGUAGE)) {
        String 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;

        }
    }
    //this doenst even get called but i need it for the implementation
}

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(); //tried like 4 ways to do this, nothing really worked
    //finish();
    //startActivity(getIntent());
}
}

SettingsFragment.java

public class SettingsFragment extends PreferenceFragment {


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

    // Load the preferences from an XML resource
    addPreferencesFromResource(R.xml.preferences);

}
}

AndroidManifest.xml

android:configChanges="locale|orientation" //added to main and settings activity

我为此感到疯狂,这是最佳的工作状态,但是我知道这里的活动生命周期管理远非最佳,当我尝试使用这些工具时,我通常无法正常工作.我该如何进行这项工作,使其实际上在所有活动的运行时更新?

I'm getting crazy over this, this is the best working state, but I know the activity lifecyle managment here is far from the best, when I try with those, I can't get it to work at all usually. How can I make this work so it actually updates on run time on all activities?

推荐答案

最后,我使它无需使用片段即可工作.因此,这里有一些不推荐使用的方法,我也尝试了使用片段,但是还没有完整的成功.这段代码总是在更改后刷新SettingsActivity,而MainActivity本身更新得太正确了.

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

这篇关于使用偏好设置在运行时更改语言[android]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆