使用首选项 [android] 在 运行 时间内更改语言
Changing language in run time with Preferences [android]
为此,我阅读了几次 official guide 以及许多其他内容,例如本网站上的问题,但我无法 100% 完成我的工作
截至目前,如果我更改列表首选项中的语言,activity (SettingsActivity) 将不会自行更新(大约 20 次中有 1 次,不知何故会,不知道为什么)。按下后退按钮后,我的 MainActivity 也没有更新。但是我所有其他 activitys 总是显示正确的语言,如果我返回到 SettingsActivity 就没问题了,与 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
}
设置活动
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
我对此感到很疯狂,这是最好的工作状态,但我知道这里的 activity 生命周期管理远非最佳,当我尝试这些时,我无法得到它正常工作。我怎样才能使这项工作真正在所有活动的 运行 时间更新?
更改语言后,如果您还想看到更改后的语言,则需要重新启动当前的 activity。例如像这样:
private void restartActivity() {
Intent intent = getIntent();
finish();
startActivity(intent);
}
在这里查看最佳答案How to refresh activity after changing language (Locale) inside application
最后我没有使用片段就让它工作了。所以这里有一些不推荐使用的方法,我也尝试过片段,但没有完全成功(还)。此代码总是在更改后刷新 SettingsActivity,而 MainActivity 自行更新太正确了。
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);
}
}
设置活动
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();
}
}
为此,我阅读了几次 official guide 以及许多其他内容,例如本网站上的问题,但我无法 100% 完成我的工作
截至目前,如果我更改列表首选项中的语言,activity (SettingsActivity) 将不会自行更新(大约 20 次中有 1 次,不知何故会,不知道为什么)。按下后退按钮后,我的 MainActivity 也没有更新。但是我所有其他 activitys 总是显示正确的语言,如果我返回到 SettingsActivity 就没问题了,与 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
}
设置活动
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
我对此感到很疯狂,这是最好的工作状态,但我知道这里的 activity 生命周期管理远非最佳,当我尝试这些时,我无法得到它正常工作。我怎样才能使这项工作真正在所有活动的 运行 时间更新?
更改语言后,如果您还想看到更改后的语言,则需要重新启动当前的 activity。例如像这样:
private void restartActivity() {
Intent intent = getIntent();
finish();
startActivity(intent);
}
在这里查看最佳答案How to refresh activity after changing language (Locale) inside application
最后我没有使用片段就让它工作了。所以这里有一些不推荐使用的方法,我也尝试过片段,但没有完全成功(还)。此代码总是在更改后刷新 SettingsActivity,而 MainActivity 自行更新太正确了。
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);
}
}
设置活动
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();
}
}