2014-01-31 3 views
3

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

public class MyFragment extends PreferenceFragment { 
    public void onCreate(Bundle state) { 
    addPreferencesFromResource(...); 
    ListPreference myList = (ListPreference) findPreference("myid"); 

    ... 
    if (condition) { 
     // hide myList 
    } 
} 

}

Я не могу найти какой-либо метод либо на ListPreference или на PreferenceFragment, чтобы скрыть его от показано в пользовательском интерфейсе. Был бы признателен, если бы вы могли указать мне в правильном направлении.

+0

Возможный дубликат [Android: ListPreference hide/disable value] (http://stackoverflow.com/questions/6954927/android-listpreference-hide-disable-value) – Merlin

+0

Я уже видел это. Он говорит о скрытии значений, когда отображается элемент управления списком. В моем случае я хочу удалить сам элемент управления. – Peter

ответ

9

После большой отладки, получается, что это было довольно просто. Вот что вам нужно сделать:

Прежде всего, получите PreferenceCategory, к которой принадлежит элемент. Затем просто вызовите removePreference.

PreferenceCategory myCategory = (PreferenceCategory) findPreference("myPrefCategory"); 
myCategory.removePreference(myList); 
+0

Что делать, если 'ListPreference' не относится к категории? – fiddler

0

Вы можете просто использовать унаследованные методы из суперкласса Preference.

 
myList.setShouldDisableView(true); 
myList.setEnabled(false); 

Первым будет делать вид подложки предпочтительности исчезает, когда предпочтение отключено, второй будет на самом деле отключить предпочтение.

+0

Это близко. Тем не менее, позиция в диалоговом окне предпочтений все еще отображается, хотя теперь она неактивна. – Peter

+0

Это не работает по какой-либо причине (возможно, оно использовалось для работы в версиях старше Lollipop). Предпочтение выделено серым цветом. –

1

Для тех, кому интересно, как удалить элемент, который не имеет родительской категории - вы должны назвать свой корень так:

<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:key="root_preferences"> 
<PreferenceCategory 
     android:title="Developer tools" 
     android:key="dev_tools_category"> 

Тогда, например:

if (!BuildConfig.DEBUG) { 
    PreferenceScreen rootPreferences = (PreferenceScreen) findPreference("root_preferences"); 
    PreferenceCategory devCategory = (PreferenceCategory) findPreference("dev_tools_category"); 
    rootPreferences.removePreference(devCategory); 
} 

В приведенном выше примере " dev_tools_category "может быть любой виджет предпочтений или, как я показал - категория.

Смежные вопросы