Удаление / скрытие предпочтений с экрана

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

Solutions Collecting From Web of "Удаление / скрытие предпочтений с экрана"

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

 myPreferenceScreen.removePreference(myPreference); 

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

XML:

 <PreferenceCategory android:key="category_foo" android:title="foo"> <CheckBoxPreference android:key="checkPref" /> 

Ява:

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

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

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

Если вы хотите что-то, что будет динамически изменять префы, например, в 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(); } } 

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

В файле 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 

Если вы хотите оценить и на основе этой маски, альтернативой может быть / (Si deseas evaluationar, y en base eso ocultar, una alternativa puede ser):

 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 esto debe ir dentro):

Public static class PrefsFragment extends PreferenceFragment {

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

Вот общий способ сделать это, который работает независимо от того, находится ли предпочтение в 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; } 

Я рекомендую использовать предпочтение V7, у него есть метод setVisible (). Но я еще не пробовал. Соответственно, вы должны использовать PreferenceFragment вместо PreferenceActivity https://developer.android.google.cn/reference/android/support/v7/preference/Preference.html#setVisible(boolean)