如何获取偏好设置的类别?PreferenceManager有一个findPreference方法,但是Preference没有一个getCategory方法。是否有一种方法可以通过偏好设置的键名获取其类别?
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()方法,但是你可以使用以下解决方法:如果你没有使用Preference的dependency属性,那么可以将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();
您是在PreferenceActivity
中还是其他地方尝试这样做?如果是在那里,请尝试以下方法。它应该循环遍历您的类别并找到正确的类别。只需确保在每次更改xml时更新catKeys
数组以包括要搜索的类别即可。
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;
}
}
我在Preference中找不到getCategory或getGroup方法。
但是,你可以使用PreferenceCategory继承的方法, 来自http://developer.android.com/reference/android/preference/PreferenceGroup.html
getPreference(int index)
int getPreferenceCount()
对于你想要做的事情来说,这确实是一条漫长的路,但看起来你确实应该重新构建偏好菜单。
另一个选择是解析你的 XML 偏好文件。
祝好, 斯蒂芬
你可以通过遍历所有的偏好设置,然后检查任何你想要的偏好设置的父级是哪一个,甚至不需要使用父级的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)
我不确定目前是否可用。