ListPreference dependency ListPreference dependency android android

ListPreference dependency


The only way you can do something like this is programmaticly.

You'd have to set up an change listener on the ListPreference and then enable/disable the other one.

itemList = (ListPreference)findPreference("itemList");itemList2 = (ListPreference)findPreference("itemList2");itemList.setOnPreferenceChangeListener(newPreference.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;  }});

If I were you I wouldn't even show the second preference if the first isn't set properly. To do that you have to declare the preference manually (not in the XML) and add/remove it instead of enabling/disabling.

Now isn't this the bestest answer you've ever seen?!

Emmanuel


Subclass ListPreference class, and override setValue and shouldDisableDependence methods.

setValue will call notifyDependencyChange(shouldDisableDependents()) after super.setValue when the value is actually changed.

shouldDisableDependence returns false only if the current value is item3, or any other desired value stored in mDepedenceValue.

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


I tried to edit @waterdragon solution but it was "peer rejected". Not sure why because it is still his solution but provides a concrete example.

Subclass ListPreference class, and override setValue and shouldDisableDependence methods.

setValue will call notifyDependencyChange(shouldDisableDependents()) after super.setValue when the value is actually changed.

shouldDisableDependence returns false only if the current value is item3, or any other desired value stored in 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);    }}

Update your attrs.xml:

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

and inside your preference xml tie it to any other preference that depends on it:

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