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.