Подтвердить что ты не робот

Зависимость ListPreference

У меня есть ListPreference, которые выглядят примерно так:

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

Затем у меня есть другое предпочтение, которое должно быть включено только в том случае, если в элементе ListPreference выбран пункт "item3".

Можно ли как-то выполнить это с помощью android:dependency? Что-то вроде android:dependency="itemList:item3"

Спасибо!

4b9b3361

Ответ 1

Единственный способ сделать что-то подобное - программно.

Вам нужно будет настроить прослушиватель изменений в ListPreference, а затем включить/отключить другой.

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

Если бы я был вами, я бы даже не показал второе предпочтение, если первое не установлено должным образом. Для этого вам нужно объявить предпочтение вручную (не в XML) и добавить/удалить его вместо включения/отключения.

Теперь не самый лучший ответ, который вы когда-либо видели?

Эммануэль

Ответ 2

Подкласс ListPreference и переопределить методы setValue и shouldDisableDependence.

setValue выведет notifyDependencyChange(shouldDisableDependents()) после super.setValue, когда значение действительно изменится.

shouldDisableDependence возвращает false только в том случае, если текущее значение равно item3 или любое другое желаемое значение, сохраненное в 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);
}

Ответ 3

Я попытался отредактировать решение @waterdragon, но он был отвергнут. Не уверен, почему, поскольку он по-прежнему является его решением, но дает конкретный пример.

Подкласс ListPreference и переопределить методы setValue и shouldDisableDependence.

setValue выведет notifyDependencyChange(shouldDisableDependents()) после super.setValue, когда значение действительно изменится.

shouldDisableDependence возвращает false только в том случае, если текущее значение равно item3 или любое другое желаемое значение, сохраненное в 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);
    }
}

Обновите свой attrs.xml:

<attr name="dependentValue" format="string" />

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

и внутри вашего предпочтения xml привяжите его к любому другому предпочтению, которое зависит от него:

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