Android偏好设置更改在同一PreferenceActivity中显示的偏好设置

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)包含一个首选项:

<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首选项正确显示,但是

"size of sharedPreferences 2"

输出表明仍然存在旧的首选项。如果我遍历listAdapter,我也会得到旧的首选项。

您有任何解决这个问题的想法吗?

我发现ListAdapter已经过时了。如果我通过getPreferenceScreen().getPreferenceCount()获取项目数,则可以获得正确的数量。但是如何访问这些首选项呢?

2个回答

0
我相信问题在于您有两个包含名为“key”的关键字的偏好设置,尽管它们位于不同的屏幕上。偏好设置是由其关键字来识别的,并且需要是唯一的以避免冲突。侦听器仅从关键字知道哪个偏好设置正在发生更改。我建议更改关键字以具有唯一的值。

0

编辑:嗯,不对啊:S

...

好的,我终于找到解决方案了。在更改了 PreferenceScreen 后,我需要手动重新绑定 listView:
 getPreferenceScreen().bind((ListView)findViewById(android.R.id.list));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接