Как получить категорию предпочтения Android? - PullRequest
11 голосов
/ 30 мая 2011

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

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

Ответы [ 5 ]

9 голосов
/ 13 июля 2013

В 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;
}
4 голосов
/ 31 марта 2013

Нет метода 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's attributes such as its title:
String prefCatTitle = catPref.getTitle().toString();
3 голосов
/ 30 мая 2011

Вы пытаетесь сделать это изнутри 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;
    }
}
0 голосов
/ 17 апреля 2014

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

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)

Я не уверенесли в настоящее время это доступно или нет, хотя.

0 голосов
/ 30 мая 2011

Я не вижу getCategory или getGroup ни в Preference.

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

getPreference(int index)

int getPreferenceCount()

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

Другой альтернативой будет сэксп ваш файл преференций xml.

С уважением, Стефан

...