android dependencies preferences

android - Dependencia de ListPreference



sharedpreferences android (3)

Tengo un ListPreference que se parece a esto:

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

Luego, tengo otra preferencia que solo debería estar habilitada si se selecciona "item3" en el ListPreference .

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

¡Gracias!


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

Subclase de la clase setValue y shouldDisableDependence métodos setValue y shouldDisableDependence .

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

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); } }

Actualice su attrs.xml:

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

y dentro de su preferencia, vincule xml con cualquier otra preferencia que dependa de ello:

<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" />


La única forma en que puedes hacer algo como esto es programáticamente.

Tendría que configurar un detector de cambios en el 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 fuera tú, ni siquiera mostraría la segunda preferencia si la primera no está configurada correctamente. Para hacerlo, debe declarar la preferencia manualmente (no en el XML) y agregarla / eliminarla en lugar de habilitar / deshabilitar.

¡¿No es esta la mejor respuesta que hayas visto ?!

Emmanuel


Subclase de la clase setValue y shouldDisableDependence métodos setValue y shouldDisableDependence .

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

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); }