SharedPreferences未更新

时间:2017-05-30 13:37:31

标签: java android sharedpreferences android-context

我尝试使用一个设置创建一个简单的设置活动来更改应用程序的语言。

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

}

当我调试活动时,我看到onSharedPreferenceChanged方法中收到的更新值。

然而,当我调用Intent重新加载活动时,使用上下文包装器来更改语言,从调用newBase.getSharedPreferences(&#34; lang&#34;,MODE_PRIVATE)收到的值仍然是原始不变的价值。

当我再次点击界面中的首选项时,我看到值哈希发生了变化。

我需要保存值吗?

为什么它在SharedPreferences类中没有改变?

我试图复制这里的例子:

Android context.getResources.updateConfiguration() deprecated

提前致谢。

2 个答案:

答案 0 :(得分:1)

尝试更改:

SharedPreferences pref =  newBase.getSharedPreferences("lang", MODE_PRIVATE);

要:

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(TCPreferenceActivity.this);

出于某种原因,你正在装载私人&#34; lang&#34;偏好,我很确定你没有保存。使用默认首选项,而默认情况下,活动应该使用where where。

答案 1 :(得分:0)

我宁愿您使用apply()而不是commit()。

与commit()同步地将其首选项写入持久存储,apply()会立即将其更改提交到内存中的SharedPreferences,但会启动异步提交到磁盘。

这样做;

 SharedPreferences.Editor editor = sharedPreferences.edit();
 editor.putString("lang", sharedPreferences.getString(key, "en_US"));
 editor.apply();