如何获得PreferenceCategory
的{{1}}? Preference
使用findPreference
方法,但Preference
没有PreferenceManager
方法。
有没有办法从它的关键名称中获取getCategory
的{{1}}?
答案 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)
我不确定目前是否可以使用。