我有两个首选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()我得到了正确的数量。但是如何访问这些偏好?
答案 0 :(得分:0)
我很确定问题在于你有两个偏好和一键“钥匙”,即使它们在不同的屏幕上。优先权由其密钥标识,并且这需要是唯一的以避免冲突。监听器只知道从密钥更改了哪个首选项。我会将密钥更改为具有唯一值。
答案 1 :(得分:0)
...
哦,我终于找到了解决方案。更改PreferenceScreen后,我需要再次手动绑定listView: getPreferenceScreen().bind((ListView)findViewById(android.R.id.list));