2010-08-10 9 views

Respuesta

0

Las preferencias son valores únicos por definición. Si desea implementar una opción múltiple ListPreference, es posible que tenga que crear una subclase de esta clase o android.preference.Preference y crear su propia implementación.

Como alternativa, puede llamar a una actividad desde una pantalla de preferencias simples y manejar todo usted mismo.

Puede almacenar los valores en una preferencia de Cadena con un separador o mejor aún, como varias preferencias booleanas.

10

¡Aquí está todo el código que necesita!

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

Gracias por el puesto, que me ha ayudado mucho. Hice algunos cambios en la clase para permitir a los usuarios actualizar el resumen que se muestra en las preferencias con los valores seleccionados.

De esta manera el usuario puede ver sus elecciones sin abrir el Spinner.

Éstos son los métodos añadidos:

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

El setSummary método debe ser llamado dentro de la SettingsActivity.java aquí:

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

Los setEntryValues ​​método puede ser invocado junto con setEntries.

¡Funcionó para mí! Compatible con Android 2.2 o posterior.

Cuestiones relacionadas