Как удалить предпочтение из PreferenceActivity?
Я использую PreferenceActivity. Как удалить предпочтение? Кажется, я не могу заставить это работать:
Preference p = findPreference("grok");
boolean worked = getPreferenceScreen().removePreference(p);
// worked == false.
Итак, предпочтение найдено, но вызов removePreference() завершается с ошибкой. Каков правильный способ сделать это? Я использую файл preference.xml для таких ключей:
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="foo">
<CheckBoxPreference
android:key="grok" />
...
Спасибо
Ответы
Ответ 1
вы можете удалить только точный дочерний элемент в PreferenceGroup. Итак, в вашем случае вы должны добавить некоторый ключ в PreferenceCategory (с title= "foo" ), затем findPreference с этим ключом, а затем удалить его дочерний
XML:
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="category_foo"
android:title="foo">
<CheckBoxPreference
android:key="grok" />
...
код:
Preference p = findPreference("grok");
// removing Preference
((PreferenceGroup) findPreference("category_foo")).removePreference(p);
Ответ 2
Вместо того, чтобы устанавливать несколько идентификаторов, вы можете получить все дерево предпочтений и найти родителя любого предпочтения, а затем удалить любые его дочерние предпочтения:
public static Map<Preference,PreferenceGroup> buildPreferenceParentTree(final PreferenceActivity activity)
{
final Map<Preference,PreferenceGroup> result=new HashMap<Preference,PreferenceGroup>();
final Stack<PreferenceGroup> curParents=new Stack<PreferenceGroup>();
curParents.add(activity.getPreferenceScreen());
while(!curParents.isEmpty())
{
final PreferenceGroup parent=curParents.pop();
final int childCount=parent.getPreferenceCount();
for(int i=0;i<childCount;++i)
{
final Preference child=parent.getPreference(i);
result.put(child,parent);
if(child instanceof PreferenceGroup)
curParents.push((PreferenceGroup)child);
}
}
return result;
}
Пример:
final Map<Preference,PreferenceGroup> preferenceParentTree=buildPreferenceParentTree(SettingsActivity.this);
final PreferenceGroup preferenceParent=preferenceParentTree.get(preferenceToRemove);
preferenceGroup.removePreference(preferenceToRemove);