Как получить категорию предпочтений Android?

Как мне получить PreferenceCategory для Preference? PreferenceManager имеет findPreference, но Preference не имеет метода getCategory.

Есть ли способ получить PreferenceCategory от Preference от его имени?

Ответ 1

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

Ответ 2

Нет метода getCategory(), но вы можете использовать это следующее обходное решение: если вы не используете атрибут зависимостей для своего Предпочтения, вы можете установить свое предпочтение как зависимое от 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 attributes such as its title:
String prefCatTitle = catPref.getTitle().toString();

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

Ответ 4

Я не вижу getCategory или getGroup ни в настройках.

Но вы можете использовать методы PreferenceCategory унаследовано от http://developer.android.com/reference/android/preference/PreferenceGroup.html

getPreference(int index)

int getPreferenceCount()

Это долгий путь для того, что вы хотите сделать, но похоже, что вы действительно должны перестроить меню настроек.

Другой альтернативой было бы сделать saxp ваш файл prefrence xml.

С уважением,  Stéphane

Ответ 5

Вы можете найти все дочернее дерево-родительское дерево, пройдя через все настройки, а затем проверьте, является ли родитель любого желаемого вами предпочтения, даже без использования идентификатора родителя:

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