¿Cómo mostrar y ocultar las preferencias en Android dinámicamente?

¿Hay una manera de mostrar y ocultar las preferencias dinámicamente? En mi caso, tengo una preferencia de casilla de verificación que deshabilitaría o activaría uno de los dos grupos de preferencias (grupos "con" y "sin discapacidad"). Si bien esta sería la interfaz gráfica de usuario ideal en un entorno de escritorio, el "con discapacidad" ocupa casi toda la pantalla, mientras que el otro, "sin discapacidad" ocupa sólo una pequeña parte de la pantalla.

En lugar de mostrar ambos grupos al mismo tiempo, me gustaría mostrar sólo uno de ellos a la vez y mostrar u ocultar dinámicamente los 2 grupos cuando cambia la casilla de verificación. ¿Hay alguna forma de hacer esto?

Desde una llamada de PreferenceActivity

Preference somePreference = findPreference(SOME_PREFERENCE_KEY); PreferenceScreen preferenceScreen = getPreferenceScreen(); preferenceScreen.removePreference(somePreference); 

Puede llamar más tarde:

 preferenceScreen.addPreference(somePreference); 

La única parte un poco complicada es obtener el orden correcto al agregar de nuevo pulg Mira la documentación de PreferenceScreen , en particular es la clase base, PreferenceGroup para más detalles.

No exactamente ocultar / mostrar, pero si sólo desea deshabilitar / habilitar la preferencia en función de otra preferencia puede especificar android:dependency="preferenceKey" o Preference.setDependency(String)

Ejemplo de developer.android.com :

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="pref_sync" android:title="@string/pref_sync" android:summary="@string/pref_sync_summ" android:defaultValue="true" /> <ListPreference android:dependency="pref_sync" android:key="pref_syncConnectionType" android:title="@string/pref_syncConnectionType" android:dialogTitle="@string/pref_syncConnectionType" android:entries="@array/pref_syncConnectionTypes_entries" android:entryValues="@array/pref_syncConnectionTypes_values" android:defaultValue="@string/pref_syncConnectionTypes_default" /> </PreferenceScreen> 

Si desea implementar la ocultación de la preferencia completamente en la Preferencia, aquí hay un ejemplo. Sin embargo, no permite volver a ser visible.

 public class RemovablePreference extends Preference { @Override protected void onBindView(View view) { super.onBindView(view); updateVisibility(); // possibly a better place available? } private void updateVisibility() { Context context = getContext(); // should be a PreferenceActivity if (context instanceof PreferenceActivity) { updateVisibility((PreferenceActivity)context); } } private void updateVisibility(PreferenceActivity activity) { updateVisibility(getPreferenceScreen(activity)); } private PreferenceScreen getPreferenceScreen(PreferenceActivity activity) { if (activity.getPreferenceScreen() != null) { return activity.getPreferenceScreen(); // for old implementations } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { Fragment fragment = activity.getFragmentManager().findFragmentById(android.R.id.content); if (fragment instanceof PreferenceFragment) { return ((PreferenceFragment) fragment).getPreferenceScreen(); } } return null; } private void updateVisibility(PreferenceScreen screen) { if (!isVisible() && screen != null) { hidePreference(screen, this); } } private boolean hidePreference(PreferenceGroup prefGroup, Preference removedPreference) { boolean removed = false; if (prefGroup.removePreference(removedPreference)) { removed = true; } for (int i = 0; i < prefGroup.getPreferenceCount(); i++) { Preference preference = prefGroup.getPreference(i); if (preference instanceof PreferenceGroup) { PreferenceGroup prefGroup2 = (PreferenceGroup)preference; if (hidePreference(prefGroup2, this)) { // The whole group is now empty -> remove also the group if (prefGroup2.getPreferenceCount() == 0) { removed = true; prefGroup.removePreference(prefGroup2); } } } } return removed; } protected boolean isVisible() { return true; // override } 

Recomiendo usar la preferencia de V7 , tiene el método setVisible() . Pero no lo he probado todavía.

  • Cómo setOnTouchListener () en un ListPreference?
  • PreferenciaActividad: guardar valor como entero
  • PreferenciaActividad getSupportLoaderManager ()
  • Uso de findviewbyid en preferenciaactividad
  • RunTimeException en PreferenceFragment
  • ActivityNotFoundException (YES, esta actividad se declara en AndroidManifest.xml)
  • Mantenga la barra de acciones visualizada al cambiar PreferenceScreen
  • ¿PreferenceFragment con el fondo transparente?
  • Configuración de valores predeterminados de varias instancias / archivos de SharedPreferences
  • Problemas con pantallas de preferencias de doble panel
  • ¿Cómo detectar si se hicieron cambios en las preferencias?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.