2010-08-10 14 views
7

Kullanıcının listede birden fazla öğe seçmesine izin veren bir tercih iletişim penceresi oluşturmaya çalışıyorum. Şu anda sadece bir öğe seçmenize izin veriyor. Bunu yapmanın kolay bir yolu var mı? İnternete baktım ve henüz bir yol görmedim. Herhangi bir yardım takdir edilir!Android'de ListPreference çoklu seçim yapmak için kolay yolu?

cevap

0

Tercihler, tanıma göre tek değerlerdir. Çok seçenekli bir ListPreference uygulamak istiyorsanız, bu sınıfı veya android.preference.Preference alt sınıfını ve kendi uygulamanızı oluşturmanız gerekebilir.

Alternatif olarak, basit bir tercih ekranından bir etkinliği çağırabilir ve her şeyi kendiniz halledebilirsiniz.

Değerleri, bir dize tercihi bir ayırıcıyla veya daha iyisi, çeşitli boole tercihleri ​​olarak kaydedebilirsiniz.

10

İşte ihtiyacınız olan kod!

Android Api Düzeyli bunu istiyorsun hangi İçin

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

Teşekkür kullanabilirsiniz kullanabilirsiniz, o bana çok yardımcı oldu. Kullanıcıların tercihlerde gösterilen özeti seçilen değerlerle güncellemelerine izin vermek için sınıfa bazı değişiklikler yaptım.

Bu sayede kullanıcı, Spinner'ı açmadan seçimlerini görebilir.

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

yöntem setSummary burada SettingsActivity.java içinde adı olmalıdır:

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

yöntem setEntryValues ​​setEntries birlikte çağrılabilir

Burada ilave yöntemlerdir.

Benim için çalıştı! Android 2.2 veya üstü ile uyumludur.

İlgili konular