如何从PreferenceActivity中删除首选项?

时间:2011-01-20 22:44:00

标签: android

我正在使用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" />

            ...

由于

2 个答案:

答案 0 :(得分:27)

您只能删除PreferenceGroup中的确切子项。因此,在您的情况下,您应该向PreferenceCategory添加一些键(标题=“foo”),然后使用此键添加一些键&amp;然后删除它的孩子

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);

答案 1 :(得分:3)

您可以获取整个首选项树,找到任何首选项的父项,然后删除其所有子项首选项,而不是设置多个ID:

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);

编辑:似乎有一个新的API:

https://developer.android.com/reference/androidx/preference/Preference#setVisible(boolean)

我不确定目前是否可以使用。