2010-10-19 13 views
26

मैं एक ListPreference जो कुछ इस तरह दिखाई है।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; 
    } 
}); 

यदि मैं आप थे तो पहली बार ठीक से सेट नहीं होने पर मैं दूसरी वरीयता भी नहीं दिखाऊंगा। ऐसा करने के लिए आपको वरीयता को मैन्युअल रूप से घोषित करना होगा (एक्सएमएल में नहीं) और इसे सक्षम/अक्षम करने के बजाय इसे जोड़ें/हटाएं।

अब यह सबसे अच्छा जवाब नहीं है जिसे आपने कभी देखा है ?!

एम्मानुएल

+5

मैं एक अंग पर बाहर जाना होगा और कहें कि मैंने कभी देखा है कि यह सबसे अच्छा जवाब है। –

+2

@Emmanuel: itemList और itemList2 चर को अंतिम घोषित किया जाना चाहिए। वैसे भी, मैंने मतदान किया, क्योंकि आपका जवाब मेरे लिए बहुत अच्छा काम करता है! –

+1

क्या आइटम सूची 2 * छुपे हुए * बूलियन मान (एक प्राथमिकता जो वरीयता स्क्रीन पर दिखाई नहीं दे रही है) पर निर्भर हो सकती है, और फिर उपरोक्त कोड में इस छिपे हुए मान को सही या गलत पर सेट करें? प्रभाव वही होगा, लेकिन मुझे लगता है कि यदि आइटम आइटम (केवल एक के बजाय) के आधार पर आपकी कई प्राथमिकताएं थीं तो यह थोड़ा और सुविधाजनक होगा। यदि संभव हो, तो आप इस मूल्य को कैसे छुपा सकते हैं? – Malabarba

6

उपवर्ग ListPreference वर्ग, और ओवरराइड setValue और shouldDisableDependence तरीकों।

setValuesuper.setValue के बाद notifyDependencyChange(shouldDisableDependents()) पर कॉल करेगा जब मूल्य वास्तव में बदल जाएगा।

shouldDisableDependence केवल तभी झूठा लौटाता है जब वर्तमान मान 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); 
} 
2

मैंने @ वाटरड्रैगन समाधान को संपादित करने का प्रयास किया लेकिन यह "सहकर्मी खारिज कर दिया गया" था। निश्चित नहीं है कि क्यों यह अभी भी उसका समाधान है लेकिन एक ठोस उदाहरण प्रदान करता है।

सबक्लास ListPreference कक्षा, और setValue और shouldDisableDependence विधियों को ओवरराइड करें।

setValuesuper.setValue के बाद notifyDependencyChange(shouldDisableDependents()) पर कॉल करेगा जब मूल्य वास्तव में बदल जाएगा।

shouldDisableDependence केवल तभी झूठा लौटाता है जब वर्तमान मान item3 है, या mDepedenceValue में संग्रहीत कोई अन्य वांछित मान। अपने attrs.xml

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

अद्यतन:

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

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

और अपनी पसंद एक्सएमएल किसी अन्य वरीयता है कि यह इस पर निर्भर करता करने के लिए इसे टाई के अंदर:

<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" /> 
संबंधित मुद्दे