偏好活动中的 Android 更新语言
Posted
技术标签:
【中文标题】偏好活动中的 Android 更新语言【英文标题】:Android update language in preference activity 【发布时间】:2011-12-09 09:31:45 【问题描述】:在我的 android 应用程序中,我有一个偏好活动,让用户覆盖应用程序的语言。为此,我在每个活动的 onResume() 中调用此函数,然后重置内容视图:
public static void checkOverrideSystemLanguage(Context context)
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(context);
// Check if system's language setting needs to be overridden
boolean overrideSystemLanguage = prefs.getBoolean(context
.getString(R.string.pref_key_chkbx_override_system_language),
false);
if (overrideSystemLanguage)
// Get language selection and possible languages
String localeString = prefs.getString(
context.getString(R.string.pref_key_list_languages), "");
List<String> possibleLanguages = Arrays.asList(context
.getResources().getStringArray(
R.array.pref_values_list_languages));
if (possibleLanguages.contains(localeString))
// Change language setting in configuration
Locale locale = new Locale(localeString);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
context.getResources().updateConfiguration(config,
context.getResources().getDisplayMetrics());
// Use default language
else
overrideSystemLanguage = false;
// Use default language
if (!overrideSystemLanguage)
context.getResources().updateConfiguration(
Resources.getSystem().getConfiguration(),
context.getResources().getDisplayMetrics());
在每一项活动中,它都运行良好。然而,在偏好活动中,当用户更改语言时,它不会立即更新,因为没有 setContentView() 方法。用户必须返回上一个活动并再次启动首选项活动才能看到反映的语言变化。
我在 onPreferenceChange() 监听器中尝试了以下操作:
更新配置、删除和读取首选项:
checkOverrideSystemLanguage(this);
// Remove all preferences and add them to update the language
getPreferenceScreen().removeAll();
addPreferencesFromResource(R.xml.preferences);
更新配置并调用 onCreate(null)
完成并重新开始活动
finish();
startActivity(new Intent(this, PreferencesActivity.class));
感谢您的帮助!
【问题讨论】:
您可以使用一些小技巧并在开头调用的某些方法中调用 getActionBar().setTitle("your title") 【参考方案1】:我遇到了类似的问题,我以这种方式解决了(如您所说:完成并重新启动活动)。有效!
public class OptionsActivity extends PreferenceActivity implements YesNoDialogPreference.YesNoDialogListener, SharedPreferences.OnSharedPreferenceChangeListener
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
//Options Setting
final SharedPreferences prefs = getSharedPreferences(OptionsUtility.PREFERENCE_NAME, MODE_PRIVATE);
String language = prefs.getString(OptionsUtility.PREFERENCE_LANGUAGE, OptionsUtility.DEFAULT_LANGUAGE);
//Update locale
OptionsUtility.updateLanguage(this, language);
prefs.registerOnSharedPreferenceChangeListener(this);
getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
getPreferenceManager().setSharedPreferencesName(OptionsUtility.PREFERENCE_NAME);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
Preference eraseGameButton = getPreferenceManager().findPreference(OptionsUtility.PREFERENCE_ERASE_GAME);
if (eraseGameButton != null)
YesNoDialogPreference yesNo = (YesNoDialogPreference)eraseGameButton;
yesNo.setListener(this);
Preference configureKeyboardPref = getPreferenceManager().findPreference("keyconfig");
if (configureKeyboardPref != null)
//KeyboardConfigDialogPreference config = (KeyboardConfigDialogPreference)configureKeyboardPref;
//config.setPrefs(getSharedPreferences(MemodroidCoreActivity.PREFERENCE_NAME, MODE_PRIVATE));
//config.setContext(this);
public void onDialogClosed(boolean positiveResult)
if (positiveResult)
DatabaseScoreManager dbsManager = new DatabaseScoreManager(getApplicationContext());
dbsManager.resetHighScores();
Toast.makeText(this, R.string.toast_highScoresReset,Toast.LENGTH_SHORT).show();
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key)
restartActivity();
@Override
protected void onStop()
super.onStop();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
private void restartActivity()
Intent intent = getIntent();
finish();
startActivity(intent);
@Override
public void onBackPressed()
finish();
【讨论】:
以上是关于偏好活动中的 Android 更新语言的主要内容,如果未能解决你的问题,请参考以下文章