我正在使用PreferenceActivity。如何删除首选项?我似乎无法让这个工作:
Preference p = findPreference("grok");
boolean worked = getPreferenceScreen().removePreference(p);
// worked == false.
因此找到了首选项,但removePreference()调用失败。这样做的正确方法是什么?我正在使用一个preference.xml文件作为键:
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="foo">
<CheckBoxPreference
android:key="grok" />
...
由于
答案 0 :(得分:27)
您只能删除PreferenceGroup中的确切子项。因此,在您的情况下,您应该向PreferenceCategory添加一些键(标题=“foo”),然后使用此键添加一些键&amp;然后删除它的孩子
XML:
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="category_foo"
android:title="foo">
<CheckBoxPreference
android:key="grok" />
...
代码:
Preference p = findPreference("grok");
// removing Preference
((PreferenceGroup) findPreference("category_foo")).removePreference(p);
答案 1 :(得分:3)
您可以获取整个首选项树,找到任何首选项的父项,然后删除其所有子项首选项,而不是设置多个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(preferenceToRemove);
preferenceGroup.removePreference(preferenceToRemove);
编辑:似乎有一个新的API:
https://developer.android.com/reference/androidx/preference/Preference#setVisible(boolean)
我不确定目前是否可以使用。