Android 如何以编程方式删除PreferenceCategory?
我需要以编程方式删除PreferenceCategory。我可以用下面的代码删除个人偏好,但我也需要删除(禁用)整个偏好类别Android 如何以编程方式删除PreferenceCategory?,android,preferences,Android,Preferences,我需要以编程方式删除PreferenceCategory。我可以用下面的代码删除个人偏好,但我也需要删除(禁用)整个偏好类别 PreferenceScreen preferenceScreen = getPreferenceScreen(); EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22"); ((PreferenceGroup) findPreference("pref
PreferenceScreen preferenceScreen = getPreferenceScreen();
EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22");
((PreferenceGroup) findPreference("prefcat")).removePreference(etp);
编辑:以下是首选项类别“prefcat”和子首选项“pref22”的工作代码:
首先不要加载
首选项类别
如果要用Java定义首选项,请不要创建PreferenceCategory
如果要用XML定义首选项,请使用三个XML文件:
在需要类别的情况下,加载所有三个XML文件。在不需要类别的情况下,只加载第一个和第三个XML文件。您可以通过获取对
首选项屏幕的引用来隐藏类别:
我需要您的xml:
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="@string/preferenceScreen">
//set all you values
//Preference, PreferenceCategory and/or CheckBoxPreference
</PreferenceScreen>
然后从首选项屏幕中删除该类别:
myCategory = (PreferenceCategory) findPreference(getResources().getString(R.string.my_category));
myPreferenceScreen.removePreference(myCategory);
您可以通过遍历所有首选项,然后检查哪一个是您想要的任何首选项的父级,甚至不使用父级的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;
}
public静态映射buildPreferenceParentTree(最终首选项活动)
{
最终映射结果=新HashMap();
最终堆栈curParents=新堆栈();
curParents.add(activity.getPreferenceScreen());
而(!curParents.isEmpty())
{
最终首选项组父项=curParents.pop();
final int childCount=parent.getPreferenceCount();
对于(int i=0;i以XML格式为首选项屏幕和首选项类别提供一个键:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="preferenceScreen" >
<PreferenceCategory
android:summary="@string/settings_billing_summary"
android:title="Title"
android:key="myPrefCat" >
<Preference
android:key="someKey"
android:summary="Sum"
android:title="Title" />
</PreferenceCategory>
</PreferenceScreen>
这个答案的依据似乎是过时的,但基本上是相同的。非常感谢。我会这样做。只是为了记录:无法删除通过编程方式从XML加载的PreferenceCategory?@hjw:我没有尝试过。我认为removePreference()
对该类别有效,但我认为您已经尝试过了。此外,如果您不需要它,为什么要首先加载它?是的,您可以使用removePreference()@Commonware,除了制作三个文件之外,还有其他方法可以在运行时删除类别吗?@commonware-FYI-我制作了一个示例项目,演示如何通过编程方式添加和删除首选类别。这并不太糟糕,让我们利用安卓提供的功能,但仍然保持良好和灵活!我不清楚什么这里是关于PreferenceCategory的问题,但您的解决方案涉及删除preferenceGroup。我有同样的情况……为了澄清,我的XML列出了PreferenceCategory,但我要删除该标题/组,我完全按照您在上面所做的那样,通过编程方式使用PreferenceGro检索对我的PreferenceCategory的引用向上声明。希望这对其他人有帮助。哦,很久以前。如果你看代码,你会看到类别被强制转换为首选项组。使用首选项组对我不起作用,但强制转换为首选项组对我起作用。这应该选作答案。使用myPreferenceScreen.removePreference(myCategory);
因为remove()
首选项屏幕上的方法不存在
myCategory = (PreferenceCategory) findPreference(getResources().getString(R.string.my_category));
myPreferenceScreen.removePreference(myCategory);
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 preferenceGroup=preferenceParentTree.get(preferenceToRemove);
preferenceGroup.removePreference(preferenceToRemove);
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="preferenceScreen" >
<PreferenceCategory
android:summary="@string/settings_billing_summary"
android:title="Title"
android:key="myPrefCat" >
<Preference
android:key="someKey"
android:summary="Sum"
android:title="Title" />
</PreferenceCategory>
</PreferenceScreen>
PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference("preferenceScreen");
PreferenceCategory myPrefCat = (PreferenceCategory) findPreference("myPrefCat");
preferenceScreen.removePreference(myPrefCat);