Зависимость 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"
Спасибо!
Ответы
Ответ 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" />