usar studio preferencias preferencia pantalla editar crear configuracion como archivos android android-preferences preferenceactivity

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



preferencias en android studio (6)

¿Hay alguna forma de mostrar y ocultar dinámicamente las preferencias? En mi caso, tengo una casilla de verificación que deshabilita o habilita uno de los 2 grupos de preferencias (grupos "con-" y "sin handicap"). Si bien esta sería la GUI ideal en un entorno de escritorio, el "con-handicap" ocupa casi toda la pantalla, mientras que el otro, "sin-handicap" ocupa solo una pequeña parte de la pantalla.

En lugar de mostrar ambos grupos al mismo tiempo, me gustaría mostrar solo 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 PreferenceActivity

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

puedes llamar mas tarde

preferenceScreen.addPreference(somePreference);

La única parte un poco complicada es hacer que el pedido sea correcto cuando se vuelve a agregar. Mire la documentación de PreferenceScreen , particularmente su clase base, PreferenceGroup para obtener más detalles.


Necesitaba algo similar: alternar un interruptor para ocultar o mostrar dos preferencias adicionales. Echa un vistazo a la aplicación de ejemplo de Android-Support-Preference-V7-Fix que trae algunos nuevos tipos de preferencias y corrige algunos problemas de la biblioteca oficial. Hay un ejemplo allí para alternar una casilla de verificación para mostrar u ocultar una categoría de preferencia.

En el fragmento que extiende PreferenceFragmentCompatDividers, puedes usar algo como:

findPreference("pref_show_extra_stuff").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { findPreference("pref_extra_stuff_01").setVisible((Boolean) newValue); findPreference("pref_extra_stuff_02").setVisible((Boolean) newValue); return true; } });

pref_extra_stuff_01 y pref_extra_stuff_02 son las dos preferencias que se ocultan cuando se alterna pref_show_extra_stuff .


No se oculta / muestra exactamente, pero si solo desea deshabilitar / habilitar la preferencia según 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>


Para ocultar las preferencias dinámicamente, creé una condición if en cuyo valor decido si quiero que se muestre o no el pref. Para hacer la ocultación real, he estado usando:

findPreference(getString(R.string.pref_key)).setLayoutResource(R.layout.hidden);

La parte difícil es hacerla visible de nuevo. No hay una forma directa de hacerlo, excepto para volver a crear el diseño. Si el valor de la condición if es falso, lo que significa que la pref debería estar visible, el código para ocultar la pref. Nunca se ejecutará, lo que dará como resultado una pref. Visible. Aquí es cómo volver a crear el diseño (en mi caso, estoy extendiendo un PreferencesListFragment):

getActivity().recreate();

Espero que haya sido útil.


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


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

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 }