如何获取Android偏好的类别?

时间:2011-05-30 13:59:33

标签: android android-preferences

如何获得PreferenceCategory的{​​{1}}? Preference使用findPreference方法,但Preference没有PreferenceManager方法。

有没有办法从它的关键名称中获取getCategory的{​​{1}}?

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

没有getCategory()方法,但您可以使用以下解决方法:如果不对Preference使用依赖属性,则可以将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();

答案 2 :(得分:3)

您是否尝试在PreferenceActivity或其他地方执行此操作?如果从那里,试试这个。它应该遍历您的类别并找到正确的类别。只需确保更新catKeys数组,以便在每次更改xml时都包含要搜索的类别。

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

答案 3 :(得分:0)

我在Preference中都没有看到getCategory或getGroup。

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

getPreference(int index)

int getPreferenceCount()

对于您想要做的事情来说,这确实很长,但看起来您确实应该重建偏好菜单。

其他替代方法是saxp你的xml prefrence文件。

此致  斯特凡

答案 4 :(得分: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)

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