如何从PreferenceActivity中删除偏好设置?

12

我正在使用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个回答

27

您只能删除PreferenceGroup中的完全匹配子项。因此,在您的情况下,您应该向PreferenceCategory添加一些键(例如title="foo"),然后使用此键查找PreferenceCategory,并删除其子项。

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

我很好奇,为什么在XML中指定PreferenceCategory但是在Java中却将其转换为PreferenceGroup时它仍然可以工作?这段代码两种方式都可以正常运行,但这似乎会让人感到困惑。 - marienke
1
@marienke,它能够工作是因为PreferenceCategoryPreferenceGroup的直接子类,这意味着PreferenceCategory就是PreferenceGroup。https://developer.android.com/reference/android/preference/PreferenceCategory.html - Attenzione

4

您可以获取所有首选项的完整树,找到任何首选项的父项,然后删除其子项中的任意一项,而无需设置多个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)

我不确定目前是否可用。


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