Как удалить PreferenceCategory программно? - PullRequest
35 голосов
/ 09 апреля 2011

Мне нужно удалить PreferenceCategory программно. Я мог бы удалить отдельные настройки с помощью следующего кода, но мне нужно также удалить (отключить) всю PreferenceCategory.

PreferenceScreen preferenceScreen = getPreferenceScreen();
EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22");
((PreferenceGroup) findPreference("prefcat")).removePreference(etp);

Редактировать: Вот рабочий код для PreferenceCategory "prefcat" и дочернего предпочтения "pref22":

PreferenceScreen preferenceScreen = getPreferenceScreen();
EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22");

PreferenceGroup preferenceGroup = (PreferenceGroup) findPreference("prefcat");
if (preferenceGroup != null) {
    preferenceGroup.removePreference(etp);
    preferenceScreen.removePreference(preferenceGroup);
}

Ответы [ 4 ]

63 голосов
/ 10 июля 2012

вы можете скрыть категорию, получив ссылку на PreferenceScreen:

I ваш 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" translatable="false">preferenceScreen</string>

в вашем коде:

preferenceScreen = (PreferenceScreen) findPreference(getResources().getString(R.string.preferenceScreen));

, а затем удалите категорию из экрана настроек:

myCategory = (PreferenceCategory) findPreference(getResources().getString(R.string.my_category));
myPreferenceScreen.removePreference(myCategory);
17 голосов
/ 09 апреля 2011

Во-первых, не загружайте PreferenceCategory.

Если вы определяете свои предпочтения в Java, не создавайте PreferenceCategory.

Если вы определяетеВаши предпочтения в XML, используйте три XML-файла:

  1. Один для вещей до этой магической категории
  2. Один для магических категорий
  3. Один для вещей после этой магической категории

В ситуациях, когда вам нужна категория, загрузите все три файла XML.В ситуациях, когда вам не нужна категория, загружайте только первый и третий XML-файлы.

8 голосов
/ 11 июля 2015

Введите ключ для вашего 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>

Теперь вы можете обратиться к своему классу preferenceScreen и preferenceCategory и использовать метод removePreference () для удаления предпочтения из объекта.screen:

    PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference("preferenceScreen");
    PreferenceCategory myPrefCat = (PreferenceCategory) findPreference("myPrefCat");
    preferenceScreen.removePreference(myPrefCat);

Этот ответ основан на ответе Дуарбу , который выглядит устаревшим, но в основном тот же.

2 голосов
/ 17 апреля 2014

Вы можете найти все дочернее родительское дерево, пройдя по всем предпочтениям, а затем проверив, кто является родительским для любого предпочтения, даже без использования идентификатора родителя:

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);

РЕДАКТИРОВАТЬ: кажется, есть новый API для этого:

https://developer.android.com/reference/androidx/preference/Preference#setVisible(boolean)

Я не уверен, что в настоящее время он доступенили нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...