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 .

¿Puedo de alguna manera lograr esto con android:dependency ? Algo como android:dependency="itemList:item3"

¡Gracias!

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" /> 
  • Referencia una pantalla de preferencias de Android separada desde dentro de otra pantalla de preferencias en XML
  • ¿Cómo abrir la última pantalla de preferencias usadas?
  • ¿Cómo puedo concatenar cadenas estáticas con recursos de cadena XML?
  • ¿Qué sucede con los datos existentes de las preferencias del usuario de Android cuando las preferencias estructuran los cambios en una nueva versión?
  • Preferencias de Android: Valores predeterminados incorrectos DESPITE "setDefaultValues"
  • ¿Cómo cambiar el tamaño del texto del mensaje de preferencia del diálogo?
  • Android exploit dalvik classes: Preferencias
  • Android: ¿Cómo puede hacer PreferenceScreen personalizado?
  • ¿Cómo agregar dinámicamente preferencias en la pantalla de preferencias y enlazar sus valores?
  • Resumen de preferencias de Android. ¿Cómo establecer 3 líneas en resumen?
  • Cómo instanciar el diseño para las preferencias personalizadas, utilizando android: atributo de diseño
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.