2010-02-10 2 views
112

У меня есть активность, которая расширяет PreferenceActivity. Я загружаю настройки из файла xml. Но в некоторых случаях мне нужно полностью скрыть одно из предпочтений на экране в зависимости от состояния моего приложения. Существует метод setEnabled, но это не совсем то, что я хочу. Я хочу полностью удалить это предпочтение с экрана. Возможно ли это?Удалить/скрыть предпочтение с экрана

+1

Мне любопытно, об этом тоже. –

ответ

153

Да, если у вас есть ссылка на как Preference, так и его родителей (а PreferenceCategory или PreferenceScreen)

myPreferenceScreen.removePreference(myPreference); 
+0

спасибо - полностью работает. –

+0

Отлично! Благодаря!Работает и имеет смысл – Bostone

+0

Возможно, я ответил на свой вопрос. http://stackoverflow.com/a/4704360/956975 – marienke

180

Если Preference находится в PreferenceCategory, вы должны сделать это:

XML:

<PreferenceCategory 
    android:key="category_foo" 
    android:title="foo"> 

<CheckBoxPreference 
    android:key="checkPref" /> 

Java:

CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref"); 
PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo"); 
mCategory.removePreference(mCheckBoxPref); 
+2

Чтобы быть справедливым, в приведенном выше ответе говорится, что вам нужен родительский «PreferenceCategory». – matt

43

В том случае, когда предпочтение отдается прямым потомком экрана предпочтений, вот некоторые автономные код:

PreferenceScreen screen = getPreferenceScreen(); 
Preference pref = getPreferenceManager().findPreference("mypreference"); 
screen.removePreference(pref); 
+3

Это не будет работать, если предпочтение находится внутри категории. вы должны «findPreference» для этой категории и удалить предпочтение из категории – MBH

+1

@MBH: Спасибо, что упомянули это предостережение! –

7

Если вы хотите что-то, что будет динамически изменять префов, например, на SwitchPreference , Я нашел, что лучший способ - поместить все мои вспомогательные опции в два контейнера категории. Сначала у вас будет все показанное, а затем вы просто удалите бит, который вам не нужен. Умный бит, вы просто запускаете воссоздание, когда что-то меняется, а затем вам не нужно ничего вручную создавать или беспокоиться о том, чтобы вернуть вещи в правильном порядке.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.preferences); 
    PreferenceCategory prefCatOne= (PreferenceCategory)findPreference("prefCatOne"); 
    PreferenceCategory prefCatTwo= (PreferenceCategory)findPreference("prefCatTwo"); 
    SwitchPreference mySwitchPref= (SwitchPreference)findPreference("mySwitchPref"); 
    PreferenceScreen screen = getPreferenceScreen(); 
    if (mySwitchPref.isChecked()) { 
    screen.removePreference(prefCatOne); 
    } else { 
    screen.removePreference(prefCatTwo); 
    } 
} 

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
    if (key.equals("mySwitchPref")) { 
     this.recreate(); 
    } 
} 

Единственный недостаток, который я могу видеть это, это есть вспышка, как экран воссозданы с нуля.

+0

Случай не работает, по крайней мере, не в 22. Но смена его на предпочтение (даже если это группировка предпочтений) работает. – Rob

+0

Роб, я просто протестировал вышеуказанный код в AV22 API22, и он работает отлично. Убедитесь, что ваш XML-контент предпочтений соответствует вашему коду. Для вышеприведенного примера SwitchPreference может быть где угодно, но вам нужно, чтобы PreferenceCategorys были прямыми дочерними элементами PreferenceScreen. – James

+0

Я только что получил категорию в качестве предпочтения, без приведения и снял ее. Работал. – Rob

0

Если вы хотите оценить, и на основе этой маски, альтернативой может быть/(Si deseas evaluar, у собственной базы ESO ocultar, уна Alternativa Puede сер):

SwitchPreference autenticacionUsuario = (SwitchPreference) findPreference("key_autenticacion_usuario"); 

final EditTextPreference Username = (EditTextPreference) findPreference("key_username_mqtt"); 
      final EditTextPreference Password = (EditTextPreference) findPreference("key_password_mqtt"); 

if (!autenticacionUsuario.isChecked()) { 
       PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("category_mqtt"); 
        preferenceCategory.removePreference(Username); 
        preferenceCategory.removePreference(Password); 
      } 

Все это должно быть в/(Todo Эсто Деб л Dentro):

общественный статический класс PrefsFragment расширяет PreferenceFragment {

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
+1

Извините, но это английский сайт. Можете ли вы ответить на английском языке? –

+0

Конечно, мое намерение состояло в том, чтобы обеспечить людей, которые не говорят по-английски –

+1

@GustavoEduardoBelduma, тогда вам, возможно, потребуется прочитать это http://meta.stackoverflow.com/a/297680/545026 –

0

Вот общий способ сделать это, который работает независимо от того, предпочтение отдается PreferenceCategory или PreferenceScreen.

private void removePreference(Preference preference) { 
    PreferenceGroup parent = getParent(getPreferenceScreen(), preference); 
    if (parent == null) 
     throw new RuntimeException("Couldn't find preference"); 

    parent.removePreference(preference); 
} 

private PreferenceGroup getParent(PreferenceGroup groupToSearchIn, Preference preference) { 
    for (int i = 0; i < groupToSearchIn.getPreferenceCount(); ++i) { 
     Preference child = groupToSearchIn.getPreference(i); 

     if (child == preference) 
      return groupToSearchIn; 

     if (child instanceof PreferenceGroup) { 
      PreferenceGroup childGroup = (PreferenceGroup)child; 
      PreferenceGroup result = getParent(childGroup, preference); 
      if (result != null) 
       return result; 
     } 
    } 

    return null; 
} 
2

В файле XML:

<PreferenceScreen 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:key="preferenceScreen"> 

<PreferenceCategory 
android:key="personalisation" 
android:title="your title here"> 

<ThemedPreference 
android:key="animation" /> 

</PreferenceScreen> 

В коде:

PreferenceScreen pPreferenceScreen = (PreferenceScreen) findPreference("preferenceScreen"); 

PreferenceCategory pCategory = (PreferenceCategory) findPreference("personalisation"); 
ThemedPreference pThemePref = (ThemedPreference) findPreference("animation"); 

pPreferenceScreen.removePreference(pCategory); //remove category 
pCategory.removePreference(pThemePref); // remove preference 
Смежные вопросы