2010-08-10 5 views

risposta

0

Le preferenze sono valori singoli per definizione. Se si desidera implementare una scelta multipla ListPreference, potrebbe essere necessario creare una sottoclasse di questa classe o android.preference.Preference e creare la propria implementazione.

In alternativa è possibile chiamare un'attività da una semplice schermata di preferenze e gestire tutto da soli.

È possibile memorizzare i valori in una preferenza String con un separatore o, meglio ancora, come varie preferenze booleane.

10

Ecco tutto il codice necessario!

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

Grazie per il post, mi ha aiutato molto. Ho apportato alcune modifiche alla classe per consentire agli utenti di aggiornare il riepilogo mostrato nelle preferenze con i valori selezionati.

In questo modo l'utente può vedere le sue scelte senza aprire lo Spinner.

Questi sono i metodi aggiunti:

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

Procedimento setSummary deve essere richiamato nel SettingsActivity.java qui:

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

I setEntryValues ​​metodo può essere chiamato insieme setEntries.

Ha funzionato per me! Compatibile con Android 2.2 o versioni successive.

Problemi correlati