如何获取Android Preference的类别?

12
如何获取偏好设置的类别?PreferenceManager有一个findPreference方法,但是Preference没有一个getCategory方法。是否有一种方法可以通过偏好设置的键名获取其类别?
5个回答

10

SDK中没有内置方法可以获取首选项的父级(类别或屏幕)。您应该在层次结构中手动查找它,以便能够编写类似以下内容的代码:

Preference preference = findPreference(key);
getParent(preference).removePreference(preference);
下面是可以实现它的方法。请注意,它应该写在你的首选项活动中(派生自PreferenceActivity类),可以通过调用getPreferenceScreen()提供层次结构根节点。
private PreferenceGroup getParent(Preference preference)
{
    return getParent(getPreferenceScreen(), preference);
}

private PreferenceGroup getParent(PreferenceGroup root, Preference preference)
{
    for (int i = 0; i < root.getPreferenceCount(); i++)
    {
        Preference p = root.getPreference(i);
        if (p == preference)
            return root;
        if (PreferenceGroup.class.isInstance(p))
        {
            PreferenceGroup parent = getParent((PreferenceGroup)p, preference);
            if (parent != null)
                return parent;
        }
    }
    return null;
}

PreferenceActivity.getPreferenceScreen() 似乎已经过时。如果出现问题,调用 getParent(somePreferenceFragment.getPreferenceScreen(),preference) 效果很好。 - tru7

5

虽然没有getCategory()方法,但是你可以使用以下解决方法:如果你没有使用Preference的dependency属性,那么可以将Preference设置为PreferenceCategory的依赖项,然后使用getDependency()方法。例如:

<PreferenceCategory 
    android:title="MyPrefCat" 
    android:key="category" 
    android:selectable="false">  
    <CheckBoxPreference 
            android:key="chkbox" 
            android:dependency="category" />
</PreferenceCategory>

现在您可以在PreferenceActivity中使用:

CheckBoxPreference currentPref = (CheckBoxPreference) findPreference("chkbox");
String prefCatKey = currentPref.getDependency();
PreferenceCategory catPref = (PreferenceCategory) findPreference(prefCatKey);
// Access PreferenceCategory's attributes such as its title:
String prefCatTitle = catPref.getTitle().toString();

3

您是在PreferenceActivity中还是其他地方尝试这样做?如果是在那里,请尝试以下方法。它应该循环遍历您的类别并找到正确的类别。只需确保在每次更改xml时更新catKeys数组以包括要搜索的类别即可。

String catKeys = {"catOne","catTwo","catThree","catFour"};

String getCategoryKey(String prefKey)
{
    PreferenceCategory curCat;
    Preference test;
    for(String catKey : catKeys)
    {
        curCat = (PreferenceCategory)findPreference(catKey);
        if(curCat == null)
            continue;
        test = curCat.findPreference(prefKey);
        if(test != null)
            return catKey;
    }
}

0

我在Preference中找不到getCategory或getGroup方法。

但是,你可以使用PreferenceCategory继承的方法, 来自http://developer.android.com/reference/android/preference/PreferenceGroup.html

getPreference(int index)

int getPreferenceCount()

对于你想要做的事情来说,这确实是一条漫长的路,但看起来你确实应该重新构建偏好菜单。

另一个选择是解析你的 XML 偏好文件。

祝好, 斯蒂芬


0

你可以通过遍历所有的偏好设置,然后检查任何你想要的偏好设置的父级是哪一个,甚至不需要使用父级的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(preference);

编辑:如果您只想隐藏它,您也可以使用以下方法:

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

我不确定目前是否可用。


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