2011-01-16 22 views
24

¿Hay alguna manera de mostrar y ocultar dinámicamente las preferencias? En mi caso, tengo una casilla de verificación que desactiva o habilita uno de los 2 grupos de preferencias (grupos "con" y "sin desventaja"). 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 solo una pequeña parte de la pantalla.¿Cómo se muestran y ocultan las preferencias en Android dinámicamente?

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 la casilla de verificación cambie. ¿Hay alguna forma de hacer esto?

+0

Se también http://stackoverflow.com/questions/2240326/remove-hide-a-preference-from-the-screen para una mejor respuesta, en caso de que esté utilizando categorías. – Eyal

Respuesta

54

Desde una llamada PreferenceActivity

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

Más tarde, puede llamar a:.

preferenceScreen.addPreference(somePreference); 
parte

El único un poco complicado es conseguir el orden correcto cuando se añade de nuevo en Mira PreferenceScreen documentación, sobre todo es la clase base, PreferenceGroup para más detalles.

+0

Grr, supongo que no hay opciones "visibles" en Android, después de todo. Gracias por la respuesta. – Japtar

+1

Después de eliminar algunas preferencias, la segunda llamada a 'findPreference()' devuelve 'nulo', ¿cómo volver a agregarlo? –

+6

@Mickey Tin: simplemente guarde la Preferencia (somePreference) anterior como miembro de la clase cuando la encuentre, luego puede eliminarla y agregarla según sea necesario. – dhaag23

2

No exactamente ocultar/mostrar, pero si sólo desea activar/desactivar 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> 
0

Si se desea implementar la ocultación de la preferencia completamente en la Preferencia, aquí hay un ejemplo. No permite volver a 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 
} 
1

recomiendo el uso de V7 preference, tiene setVisible() método. Pero aún no lo he intentado.

0

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

En el fragmento que se extiende PreferenceFragmentCompatDividers, podría utilizar 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 están ocultos cuando pref_show_extra_stuff se activa.

Cuestiones relacionadas