Как мне получить PreferenceCategory
для Preference
? PreferenceManager
имеет findPreference
, но Preference
не имеет метода getCategory
.
Есть ли способ получить PreferenceCategory
от Preference
от его имени?
Как мне получить PreferenceCategory
для Preference
? PreferenceManager
имеет findPreference
, но Preference
не имеет метода getCategory
.
Есть ли способ получить PreferenceCategory
от Preference
от его имени?
В 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;
}
Нет метода 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();
Вы пытаетесь сделать это из 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;
}
}
Я не вижу getCategory или getGroup ни в настройках.
Но вы можете использовать методы PreferenceCategory унаследовано от http://developer.android.com/reference/android/preference/PreferenceGroup.html
getPreference(int index)
int getPreferenceCount()
Это долгий путь для того, что вы хотите сделать, но похоже, что вы действительно должны перестроить меню настроек.
Другой альтернативой было бы сделать saxp ваш файл prefrence xml.
С уважением, Stéphane
Вы можете найти все дочернее дерево-родительское дерево, пройдя через все настройки, а затем проверьте, является ли родитель любого желаемого вами предпочтения, даже без использования идентификатора родителя:
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);