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
.
- Android preferencias compartidas ejemplo de altas puntuaciones?
- Fragmento de configuración de Android
- Cómo detectar cuándo una PreferenceScreen interna ha sido cerrada
- Activación / desactivación programática de rotaciones de pantalla en Android
- ¿Cómo hacer lo contrario de atributo de preferencia android: dependencia?
¿Puedo de alguna manera lograr esto con android:dependency
? Algo como android:dependency="itemList:item3"
¡Gracias!
- Iniciar una actividad desde preferences.xml
- Cambio de una preferencia 'Resumen
- Actualizar el elemento de preferencia existente en una PreferenciaActividad al regresar de una (sub) PreferenciaScreen
- ¿Cómo almacenar de forma segura el token de acceso y el secreto en Android?
- Las preferencias compartidas de Android no se guardan
- Compruebe si el dispositivo está bloqueado en modo Vertical
- ¿Cuál es la forma más adecuada de almacenar la configuración de usuario en la aplicación de Android?
- El método onPreferenceChange no se llama cuando los cambios de Listpreferences
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" />