2010-10-19 46 views
26

我有一個ListPreference這是這個樣子:ListPreference依賴

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

然後,我有另一種偏好,如果「項目3」在ListPreference選擇哪個纔可啓用。

我可以用android:dependency來完成嗎?類似於android:dependency="itemList:item3"

謝謝!

回答

28

你可以做這樣的事情的唯一方法是編程式的。

您必須在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中),並添加/刪除它,而不是啓用/禁用。

現在不是你見過的最好答案嗎?!

靈光

+5

我會去上肢體並說這是我見過的最可怕的答案。 – 2012-03-07 14:56:14

+2

@Emmanuel:itemList和itemList2變量應聲明爲final。無論如何,我投了票,因爲你的回答對我很好! – 2012-08-13 16:37:40

+1

是否有可能讓itemList2依賴* hidden *布爾值(首選項不會顯示在首選項屏幕上),然後在上面的代碼中將該隱藏值設置爲true或false?效果是一樣的,但我認爲如果你有很多喜好取決於itemList(而不是一個),它會稍微方便一些。如果可能的話,你怎麼能隱藏這個值? – Malabarba 2013-04-17 14:51:38

6

子類ListPreference類,並重寫setValueshouldDisableDependence方法。

setValue將在super.setValue後調用notifyDependencyChange(shouldDisableDependents())實際更改值。

shouldDisableDependence僅噹噹前值爲item3或存儲在mDepedenceValue中的任何其他所需值時才返回false。

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

我試圖編輯@waterdragon解決方案,但它是「同伴拒絕」。不知道爲什麼,因爲它仍是他的解決方案,但提供了一個具體的例子

子類ListPreference類,並覆蓋setValueshouldDisableDependence方法。

setValue將在super.setValue後調用notifyDependencyChange(shouldDisableDependents())實際更改值。

shouldDisableDependence僅噹噹前值爲item3或存儲在mDepedenceValue中的任何其他所需值時才返回false。

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