android首选项更改在同一首选项活动中显示的首选项

android首选项更改在同一首选项活动中显示的首选项,android,sharedpreferences,Android,Sharedpreferences,我有两个首选xml文件。第一个(pref2.xml)包含两个首选项: <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="key" android:title="title" android:defaultValue="false" />

我有两个首选xml文件。第一个(pref2.xml)包含两个首选项:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

   <CheckBoxPreference 
        android:key="key"
        android:title="title" 
        android:defaultValue="false"
    />
   <CheckBoxPreference 
        android:key="key2"
        android:title="title" 
        android:defaultValue="false"
    />
 </PreferenceScreen>
实际上,在这里,我得到了正确的输出,所有内容都显示正确。但是我想更改显示的关于一个首选项的首选项。因此,我在首选项活动中实现了OnSharedPreferenceChangeListener:

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    super.onSharedPreferenceChanged(sharedPreferences, key);

    //switch the widget type
    if (key.equals("key")){
        this.getPreferenceScreen().removeAll();
                    addPreferencesFromResource(R.xml.pref1);
                    final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
                    Log.d("LOG", "size of sharedPreferences "+adapter.getCount()+" (should be 1)");
    }
 }
好的,pref1首选项显示正确,但是

“SharedReferences 2的大小”

表示在后台仍应用旧的首选项。如果我迭代listAdapter,我也会得到旧的首选项

你知道我该怎么解决这个问题吗?
我发现listadapter有些过时。如果我通过getPreferenceScreen().getPreferenceCount()获得项目的数量,我就得到了正确的数量。但我如何访问这些首选项呢?

我很确定,问题在于您有两个首选项,且键为“key”,即使它们位于不同的屏幕上。偏好由其键确定,这需要是唯一的,以避免冲突。侦听器只知道正在从键更改哪个首选项。我会将键更改为具有唯一值。

编辑:嗯,不对:S

好了,我终于找到了解决办法。更改PreferenceScreen后,我需要再次手动绑定listView:

 getPreferenceScreen().bind((ListView)findViewById(android.R.id.list));
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    super.onSharedPreferenceChanged(sharedPreferences, key);

    //switch the widget type
    if (key.equals("key")){
        this.getPreferenceScreen().removeAll();
                    addPreferencesFromResource(R.xml.pref1);
                    final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
                    Log.d("LOG", "size of sharedPreferences "+adapter.getCount()+" (should be 1)");
    }
 }
 getPreferenceScreen().bind((ListView)findViewById(android.R.id.list));