SharedPreferences 未更新
SharedPreferences not updated
我正在尝试创建一个简单的设置 Activity,其中包含一个更改应用程序语言的设置。
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/locale">
<ListPreference
android:key="lang"
android:title="@string/language"
android:summary="@string/languageDesc"
android:entries="@array/languages"
android:entryValues="@array/languageValues"
android:defaultValue="@string/locale_en"/>
</PreferenceCategory>
public class TCPreferenceActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("lang")) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("lang", sharedPreferences.getString(key, "en_US"));
editor.commit();
settings();
}
}
public void settings() {
Intent intent = new Intent(this, TCPreferenceActivity.class);
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, TCPreferenceFragment.class.getName());
intent.putExtra(PreferenceActivity.EXTRA_NO_HEADERS, true);
startActivity(intent);
}
@Override
protected void attachBaseContext(Context newBase) {
SharedPreferences pref = newBase.getSharedPreferences("lang", MODE_PRIVATE);
String lang = pref.getString("lang", null);
Locale locale = new Locale(lang);
Context context = TCContextWrapper.wrap(newBase, locale);
super.attachBaseContext(newBase);
}
}
当我调试 activity 时,我看到在 onSharedPreferenceChanged 方法中收到更新的值。
然而,当我调用 Intent 重新加载 activity,使用上下文包装器以更改语言时,从对 newBase.getSharedPreferences("lang" 的调用中收到的值, MODE_PRIVATE) 还是原来不变的值。
当我再次点击界面中的首选项时,我看到哈希值发生了变化。
我需要保存值吗?
为什么它在 SharedPreferences class 中没有改变?
我正在尝试复制示例中所做的事情:
提前致谢。
我希望您使用 apply() 而不是 commit()。
与 commit() 不同,commit() 会将其首选项同步写入持久存储,apply() 会立即将其更改提交到内存中的 SharedPreferences,但会启动异步提交到磁盘。
这样做;
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("lang", sharedPreferences.getString(key, "en_US"));
editor.apply();
尝试更改:
SharedPreferences pref = newBase.getSharedPreferences("lang", MODE_PRIVATE);
收件人:
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(TCPreferenceActivity.this);
无论出于何种原因,您正在加载私人 "lang" 首选项,我很确定您不会保存到这些首选项。使用默认首选项,而不是 activity 默认情况下使用 else where.
我正在尝试创建一个简单的设置 Activity,其中包含一个更改应用程序语言的设置。
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/locale">
<ListPreference
android:key="lang"
android:title="@string/language"
android:summary="@string/languageDesc"
android:entries="@array/languages"
android:entryValues="@array/languageValues"
android:defaultValue="@string/locale_en"/>
</PreferenceCategory>
public class TCPreferenceActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("lang")) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("lang", sharedPreferences.getString(key, "en_US"));
editor.commit();
settings();
}
}
public void settings() {
Intent intent = new Intent(this, TCPreferenceActivity.class);
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, TCPreferenceFragment.class.getName());
intent.putExtra(PreferenceActivity.EXTRA_NO_HEADERS, true);
startActivity(intent);
}
@Override
protected void attachBaseContext(Context newBase) {
SharedPreferences pref = newBase.getSharedPreferences("lang", MODE_PRIVATE);
String lang = pref.getString("lang", null);
Locale locale = new Locale(lang);
Context context = TCContextWrapper.wrap(newBase, locale);
super.attachBaseContext(newBase);
}
}
当我调试 activity 时,我看到在 onSharedPreferenceChanged 方法中收到更新的值。
然而,当我调用 Intent 重新加载 activity,使用上下文包装器以更改语言时,从对 newBase.getSharedPreferences("lang" 的调用中收到的值, MODE_PRIVATE) 还是原来不变的值。
当我再次点击界面中的首选项时,我看到哈希值发生了变化。
我需要保存值吗?
为什么它在 SharedPreferences class 中没有改变?
我正在尝试复制示例中所做的事情:
提前致谢。
我希望您使用 apply() 而不是 commit()。
与 commit() 不同,commit() 会将其首选项同步写入持久存储,apply() 会立即将其更改提交到内存中的 SharedPreferences,但会启动异步提交到磁盘。
这样做;
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("lang", sharedPreferences.getString(key, "en_US"));
editor.apply();
尝试更改:
SharedPreferences pref = newBase.getSharedPreferences("lang", MODE_PRIVATE);
收件人:
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(TCPreferenceActivity.this);
无论出于何种原因,您正在加载私人 "lang" 首选项,我很确定您不会保存到这些首选项。使用默认首选项,而不是 activity 默认情况下使用 else where.