#android #configuration #reload #preferenceactivity
#Android #конфигурация #перезагрузка #preferenceactivity
Вопрос:
В моем приложении для 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));
Спасибо за вашу помощь!
Комментарии:
1. Вы можете использовать небольшой взлом и вызвать getActionBar().setTitle(«ваш заголовок») в каком-либо методе, который вы вызываете в начале
Ответ №1:
У меня была аналогичная проблема, которую я решил таким образом (как вы сказали: завершение и перезапуск activity). Это работает!
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();
}
}