gpt4 book ai didi

偏好 Activity 中的 Android 更新语言

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:40:29 26 4
gpt4 key购买 nike

在我的 Android 应用程序中,我有一个偏好 Activity ,让用户可以覆盖应用程序的语言。为此,我在每个 Activity 的 onResume() 中调用此函数,然后重置内容 View :

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

在每项 Activity 中,它都运行良好。然而,在首选项 Activity 中,当用户更改语言时,它不会立即更新,因为没有 setContentView() 方法。用户必须返回到上一个 Activity 并再次启动首选项 Activity 才能看到反射(reflect)的语言更改。

我在 onPreferenceChange() 监听器中尝试了以下操作:

  1. 更新配置,删除和读取首选项:

    checkOverrideSystemLanguage(this);      
    // Remove all preferences and add them to update the language
    getPreferenceScreen().removeAll();
    addPreferencesFromResource(R.xml.preferences);
  2. 更新配置并调用onCreate(null)

  3. 完成并重新启动 Activity

    finish();
    startActivity(new Intent(this, PreferencesActivity.class));

感谢您的帮助!

最佳答案

我有一个类似的问题,我是这样解决的(正如你所说:完成并重新启动 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();
}
}

关于偏好 Activity 中的 Android 更新语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7795823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com