3

我有两个首选项 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() 获得项目计数,我会得到正确的数量。但是我如何访问这些首选项?

4

2 回答 2

0

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

于 2012-05-11T07:48:36.380 回答
0

编辑:嗯,不对:S

...

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

 getPreferenceScreen().bind((ListView)findViewById(android.R.id.list));
于 2012-05-11T11:12:13.663 回答