Подтвердить что ты не робот

Как удалить предпочтение из 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" />

            ...

Спасибо

4b9b3361

Ответ 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);