2010-08-10 2 views
7

사용자가 목록에서 하나 이상의 항목을 선택할 수있는 환경 설정 대화 상자 창을 만들려고합니다. 현재는 하나의 항목 만 선택할 수 있습니다. 이 작업을 수행하는 쉬운 방법이 있습니까? 나는 인터넷 전체를 들여다 보았지만 아직까지는 그 길을 보지 못했습니다. 어떤 도움을 주셔서 감사합니다!Android에서 ListPreference 객관식을 만드는 쉬운 방법은 무엇입니까?

답변

0

환경 설정은 정의에 따라 단일 값입니다. 다중 선택 ListPreference을 구현하려는 경우이 클래스를 서브 클래스 화하거나 android.preference.Preference을 구현하고 사용자 고유의 구현을 만들어야 할 수도 있습니다.

또는 간단한 환경 설정 화면에서 활동을 호출하고 모든 것을 직접 처리 할 수 ​​있습니다.

분리 기호 또는 더 나은 부울 환경 설정으로 문자열 환경 설정에 값을 저장할 수 있습니다.

10

다음은 필요한 모든 코드입니다.

안드로이드-API 레벨은 당신이 원하는 않은

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

감사를 사용할 수 있습니다 사용할 수 있습니다, 그것은 나에게 많은 도움이되었습니다. 사용자가 환경 설정에 표시된 요약을 선택한 값으로 업데이트 할 수 있도록 클래스를 약간 변경했습니다.

이 방법으로 사용자는 Spinner를 열지 않고도 자신이 선택한 것을 볼 수 있습니다.

// 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 함께 호출 할 수

여기에 첨가 방법이다.

나를 위해 일했습니다! Android 2.2 이상과 호환됩니다.

관련 문제