android偏好更改同一PreferenceActivity中的diplayed首选项

时间:2012-05-04 10:58:11

标签: android sharedpreferences

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

<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>

和另一个(pref1.xml)包含1个首选项:

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

   <CheckBoxPreference 
        android:key="key"
        android:title="title" 
        android:defaultValue="false"
    />

 </PreferenceScreen>

在我的偏好活动中,我试图改变它们:

    public void onCreate(Bundle savedInstanceState) {       
            super.onCreate(savedInstanceState);   

            addPreferencesFromResource(R.xml.pref1);
            this.getPreferenceScreen().removeAll();
            addPreferencesFromResource(R.xml.pref2);
            final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
            Log.d("LOG", "size of sharedPreferences"+adapter.getCount()+"(should be 2)");

实际上我在这里得到正确的输出,一切都正确显示。但我想改变有关一个偏好的显示偏好。因此,我在首选项活动中实现了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首选项正确显示,但输出

  

“sharedPreferences 2的大小”

表示在后台仍然存在旧的偏好设置。如果我遍历listAdapter,我也会得到旧的首选项。

我知道如何解决这个问题吗?

我发现listadapter有些过时了。如果我通过getPreferenceScreen()得到项目数.getPreferenceCount()我得到了正确的数量。但是如何访问这些偏好?

2 个答案:

答案 0 :(得分:0)

我很确定问题在于你有两个偏好和一键“钥匙”,即使它们在不同的屏幕上。优先权由其密钥标识,并且这需要是唯一的以避免冲突。监听器只知道从密钥更改了哪个首选项。我会将密钥更改为具有唯一值。

答案 1 :(得分:0)

编辑:嗯,不对:S

...

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

 getPreferenceScreen().bind((ListView)findViewById(android.R.id.list));