2010-08-10 8 views
7

मैं एक वरीयता संवाद विंडो बनाने की कोशिश कर रहा हूं जो उपयोगकर्ता को सूची में एक आइटम का चयन करने की अनुमति देता है। वर्तमान में यह केवल आपको एक आइटम चुनने की अनुमति देता है। क्या इसे करने का कोई आसान तरीका है? मैंने पूरे इंटरनेट पर देखा है और अभी तक एक रास्ता नहीं देखा है। किसी भी मदद की सराहना की है!Android में ListPreference एकाधिक विकल्प बनाने का आसान तरीका?

उत्तर

0

प्राथमिकता परिभाषा के अनुसार एकल मान हैं। यदि आप एक से अधिक विकल्प ListPreference को कार्यान्वित करना चाहते हैं तो आपको इस कक्षा या android.preference.Preference को उप-वर्ग करना होगा और अपना स्वयं का कार्यान्वयन करना होगा।

वैकल्पिक रूप से आप एक साधारण वरीयता स्क्रीन से एक गतिविधि को कॉल कर सकते हैं और सब कुछ स्वयं को संभाल सकते हैं।

आप विभिन्न बूलियन वरीयताओं के रूप में, एक विभाजक या बेहतर के साथ स्ट्रिंग वरीयता में मूल्यों को स्टोर कर सकते हैं।

10

यहां आपको आवश्यक सभी कोड हैं!

http://blog.350nice.com/wp/wp-content/uploads/2009/07/listpreferencemultiselect.java

public class ListPreferenceMultiSelect extends ListPreference { 
    //Need to make sure the SEPARATOR is unique and weird enough that it doesn't match one of the entries. 
    //Not using any fancy symbols because this is interpreted as a regex for splitting strings. 
    private static final String SEPARATOR = "OV=I=XseparatorX=I=VO"; 

    private boolean[] mClickedDialogEntryIndices; 

    public ListPreferenceMultiSelect(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     mClickedDialogEntryIndices = new boolean[getEntries().length]; 
    } 

    @Override 
    public void setEntries(CharSequence[] entries) { 
     super.setEntries(entries); 
     mClickedDialogEntryIndices = new boolean[entries.length]; 
    } 

    public ListPreferenceMultiSelect(Context context) { 
     this(context, null); 
    } 

    @Override 
    protected void onPrepareDialogBuilder(Builder builder) { 
     CharSequence[] entries = getEntries(); 
     CharSequence[] entryValues = getEntryValues(); 

     if (entries == null || entryValues == null || entries.length != entryValues.length) { 
      throw new IllegalStateException(
        "ListPreference requires an entries array and an entryValues array which are both the same length"); 
     } 

     restoreCheckedEntries(); 
     builder.setMultiChoiceItems(entries, mClickedDialogEntryIndices, 
       new DialogInterface.OnMultiChoiceClickListener() { 
        public void onClick(DialogInterface dialog, int which, boolean val) { 
         mClickedDialogEntryIndices[which] = val; 
        } 
     }); 
    } 

    public static String[] parseStoredValue(CharSequence val) { 
     if ("".equals(val)) 
      return null; 
     else 
      return ((String)val).split(SEPARATOR); 
    } 

    private void restoreCheckedEntries() { 
     CharSequence[] entryValues = getEntryValues(); 

     String[] vals = parseStoredValue(getValue()); 
     if (vals != null) { 
      for (int j=0; j<vals.length; j++) { 
       String val = vals[j].trim(); 
       for (int i=0; i<entryValues.length; i++) { 
        CharSequence entry = entryValues[i]; 
        if (entry.equals(val)) { 
         mClickedDialogEntryIndices[i] = true; 
         break; 
        } 
       } 
      } 
     } 
    } 

    @Override 
    protected void onDialogClosed(boolean positiveResult) { 
//  super.onDialogClosed(positiveResult); 

     CharSequence[] entryValues = getEntryValues(); 
     if (positiveResult && entryValues != null) { 
      StringBuffer value = new StringBuffer(); 
      for (int i=0; i<entryValues.length; i++) { 
       if (mClickedDialogEntryIndices[i]) { 
        value.append(entryValues[i]).append(SEPARATOR); 
       } 
      } 

      if (callChangeListener(value)) { 
       String val = value.toString(); 
       if (val.length() > 0) 
        val = val.substring(0, val.length()-SEPARATOR.length()); 
       setValue(val); 
      } 
     } 
    } 
} 
4

जो Android के लिए-एपीआई स्तरीय आप इस चाहते हैं?

आप आप एपीआई स्तर 11 का उपयोग करते हैं का उपयोग कर सकते MultiSelect Preference for Android 3.0 or higher

आप एपीआई स्तरीय छोटे 11 का उपयोग करते हैं आप इस पद के लिए उपयोग कर सकते हैं इस Custom Implementation of MuliiSelect Preference

0

धन्यवाद, यह मेरे लिए एक बहुत मदद की। मैंने कक्षा में कुछ बदलाव किए हैं ताकि उपयोगकर्ता चयनित मानों के साथ वरीयताओं में दिखाए गए सारांश को अपडेट कर सकें।

इस तरह उपयोगकर्ता स्पिनर खोलने के बिना अपने विकल्प देख सकते हैं।

// Fills the Entry Values List 
@Override 
public void setEntryValues(CharSequence[] entryValues) { 
    super.setEntryValues(entryValues); 
    restoreCheckedEntries(); 
} 

// Updates the Summary 
@Override 
public void setSummary(CharSequence entries) { 
    String s = ""; 
    for (int x = 0; x < getEntryValues().length; x++) 
     if (mClickedDialogEntryIndices[x]) 
      s += (s.equals("") ? "" : ", ") + getEntries()[x]; 
    super.setSummary(s); 
} 

विधि setSummary SettingsActivity.java यहाँ के भीतर बुलाया जाना चाहिए:

private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener 
= new Preference.OnPreferenceChangeListener() { 

    @Override 
    public boolean onPreferenceChange(Preference preference, Object value) { 
     String stringValue = value.toString(); 

     if (preference instanceof ListPreferenceMultiSelect) {    
      ListPreferenceMultiSelect listPreference = 
       (ListPreferenceMultiSelect) preference; 
      listPreference.setSummary("");  
    } 

    return true; 
    } 
}; 

विधि setEntryValues ​​setEntries के साथ एक साथ कहा जा सकता है

यहाँ जोड़ा तरीके हैं।

यह मेरे लिए काम किया! एंड्रॉइड 2.2 या नए के साथ संगत।

संबंधित मुद्दे