Как программно удалить программу PreferenceCategory?
Мне нужно удалить программу PreferenceCategory программно. Я мог бы удалить индивидуальные предпочтения с помощью следующего кода, но мне также нужно удалить (отключить) всю PreferenceCategory.
PreferenceScreen preferenceScreen = getPreferenceScreen();
EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22");
((PreferenceGroup) findPreference("prefcat")).removePreference(etp);
Изменить: Здесь рабочий код для prefcat PreferenceCategory и дочернего предпочтения "pref22":
PreferenceScreen preferenceScreen = getPreferenceScreen();
EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22");
PreferenceGroup preferenceGroup = (PreferenceGroup) findPreference("prefcat");
if (preferenceGroup != null) {
preferenceGroup.removePreference(etp);
preferenceScreen.removePreference(preferenceGroup);
}
Ответы
Ответ 1
Не загружайте PreferenceCategory
в первую очередь.
Если вы определяете свои предпочтения в Java, не создавайте PreferenceCategory
.
Если вы определяете свои предпочтения в XML, используйте три файла XML:
- Один для материала перед этой магической категорией.
- Один для магической категории
- Один для материала после этой магической категории
В ситуациях, когда вы хотите получить категорию, загрузите все три файла XML. В ситуациях, когда вам не нужна категория, загружайте только первый и третий файлы XML.
Ответ 2
вы можете скрыть категорию, получив ссылку на PreferenceScreen
:
Я ваш 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>
в файле string.xml:
не забудьте установить эту новую строку
<string name="preferenceScreen">preferenceScreen</string>
в вашем коде:
preferenceScreen = (PreferenceScreen) findPreference(getResources().getString(R.string.preferenceScreen));
а затем удалите категорию из вашего экрана предпочтений:
myCategory = (PreferenceCategory) findPreference(getResources().getString(R.string.my_category));
myPreferenceScreen.removePreference(myCategory);
Ответ 3
Предоставьте ключ для вашего PreferenceScreen и вашей PreferenceCategory в 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>
В своем классе теперь вы можете обратиться к своему предпочтениюScreen и preferenceCategory и использовать метод removePreference() для удаления предпочтений с экрана:
PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference("preferenceScreen");
PreferenceCategory myPrefCat = (PreferenceCategory) findPreference("myPrefCat");
preferenceScreen.removePreference(myPrefCat);
Этот ответ основан на douarbou answer, который, как представляется, устарел, но в основном тот же.
Ответ 4
Вы можете найти все дочернее дерево-родительское дерево, пройдя через все настройки, а затем проверьте, является ли родитель любого желаемого вами предпочтения, даже без использования идентификатора родителя:
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);