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

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

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

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

Могу ли я каким-то образом выполнить это с android:dependency ? Что-то вроде android:dependency="itemList:item3"

Благодаря!

Solutions Collecting From Web of "Зависимость ListPreference"

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

Вам нужно будет настроить прослушиватель изменений в 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) и добавить / удалить его вместо включения / отключения.

Разве это не самый лучший ответ, который вы когда-либо видели ?!

Эммануэль

ListPreference подкласса 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); } 

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

ListPreference подкласса 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" />