Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Dependencia de ListPreference

Tengo una ListPreference que se parecen a algo así:

 <ListPreference android:title="Choose item" android:summary="..." android:key="itemList" android:defaultValue="item1" android:entries="@array/items" android:entryValues="@array/itemValues" /> 

Entonces, tengo otra preferencia que sólo se debe habilitar si se selecciona "item3" en ListPreference .

  • Atributos personalizados del enum de seguridad en Android
  • Emulador de Android no empieza en absoluto
  • ¿Cómo puedo generar un número aleatorio en rango en Android y mostrarlo en un campo textView el usuario es el que selecciona no máx. Y min no?
  • Cambiar el peso del diseño con una animación
  • Cambiar el tamaño del texto del botón de diálogo de Android a través de estilos
  • La notificación del constructor está obsoleta
  • ¿Puedo de alguna manera lograr esto con android:dependency ? Algo como android:dependency="itemList:item3"

    ¡Gracias!

  • ¿Cómo puedo saber si el selector de métodos de entrada está abierto o cerrado?
  • Android: determinación de un vínculo simbólico
  • No se puede cambiar el tamaño de los niños de diseño lineal en android reaccionar módulo nativo
  • ¿Cómo puedo añadir una imagen en EditText
  • Cómo establecer divisor entre columnas en tablelayout?
  • ¿Cómo acceder a una imagen desde la galería de fotos del teléfono?
  • 3 Solutions collect form web for “Dependencia de ListPreference”

    La única manera de hacer algo como esto es programmaticly.

    Tendrías que configurar un detector de cambios en ListPreference y luego habilitar / deshabilitar el otro.

     itemList = (ListPreference)findPreference("itemList"); itemList2 = (ListPreference)findPreference("itemList2"); itemList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { final String val = newValue.toString(); int index = itemList.findIndexOfValue(val); if(index==3) itemList2.setEnabled(true); else itemList2.setEnabled(false); return true; } }); 

    Si yo fuera tú, ni siquiera mostraría la segunda preferencia si la primera no se ajusta correctamente. Para ello tiene que declarar la preferencia manualmente (no en el XML) y agregarla / quitarla en lugar de habilitar / inhabilitar.

    ¿No es esta la mejor respuesta que has visto?

    Emmanuel

    Subclase ListPreference y reemplazar los métodos setValue y shouldDisableDependence .

    setValue llamará notifyDependencyChange(shouldDisableDependents()) después de super.setValue cuando el valor se cambia realmente.

    shouldDisableDependence devuelve false solo si el valor actual es item3 o cualquier otro valor deseado almacenado en mDepedenceValue .

     @Override public void setValue(String value) { String mOldValue = getValue(); super.setValue(value); if (!value.equals(mOldValue)) { notifyDependencyChange(shouldDisableDependents()); } } @Override public boolean shouldDisableDependents() { boolean shouldDisableDependents = super.shouldDisableDependents(); String value = getValue(); return shouldDisableDependents || value == null || !value.equals(mDepedenceValue); } 

    Traté de editar la solución @ waterdragon, pero fue rechazada por pares. No estoy seguro de por qué, porque sigue siendo su solución, pero proporciona un ejemplo concreto.

    Subclase ListPreference y reemplazar los métodos setValue y shouldDisableDependence .

    setValue llamará notifyDependencyChange(shouldDisableDependents()) después de super.setValue cuando el valor se cambia realmente.

    shouldDisableDependence devuelve false solo si el valor actual es item3 o cualquier otro valor deseado almacenado en mDepedenceValue .

     package xxx; import android.content.Context; import android.content.res.TypedArray; import android.preference.ListPreference; import android.util.AttributeSet; import xxx.R; public class DependentListPreference extends ListPreference { private final String CLASS_NAME = this.getClass().getSimpleName(); private String dependentValue = ""; public DependentListPreference(Context context) { this(context, null); } public DependentListPreference(Context context, AttributeSet attrs) { super(context, attrs); if (attrs != null) { TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DependentListPreference); dependentValue = a.getString(R.styleable.DependentListPreference_dependentValue); a.recycle(); } } @Override public void setValue(String value) { String mOldValue = getValue(); super.setValue(value); if (!value.equals(mOldValue)) { notifyDependencyChange(shouldDisableDependents()); } } @Override public boolean shouldDisableDependents() { boolean shouldDisableDependents = super.shouldDisableDependents(); String value = getValue(); return shouldDisableDependents || value == null || !value.equals(dependentValue); } } 

    Actualiza tu attrs.xml:

     <attr name="dependentValue" format="string" /> <declare-styleable name="DependentListPreference"> <attr name="dependentValue" /> </declare-styleable> 

    Y dentro de tu preferencia xml atarla a cualquier otra preferencia que dependa de ella:

      <xxx.DependentListPreference android:key="pref_key_wifi_security_type" android:title="Wi-Fi Security Type" app:dependentValue="1" android:entries="@array/wifi_security_items" android:entryValues="@array/wifi_security_values" /> <EditTextPreference android:key="pref_key_wifi_security_key" android:title="WPA2 Security Key" android:summary="Tap to set a security key" android:password="true" android:dependency="pref_key_wifi_security_type" /> 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.