Estoy tratando de crear una ventana de diálogo de preferencias que permita al usuario seleccionar más de un elemento en la lista. Actualmente solo le permite seleccionar un elemento. ¿Hay una forma fácil de hacer esto? He buscado en Internet y todavía no he visto una forma de hacerlo. ¡Cualquier ayuda es apreciada!¿Forma fácil de hacer la opción múltiple de ListPreference en Android?
Respuesta
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.
¡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);
}
}
}
}
Por lo que Android-Api-nivel quiere esto?
Cuando se utiliza la API de nivel 11 puede utilizar esta MultiSelect Preference for Android 3.0 or higher
Cuando se utiliza la API de nivel más pequeño 11 se puede utilizar este Custom Implementation of MuliiSelect Preference
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.
- 1. Selección múltiple ListPreference en android
- 2. Django forma múltiple opción
- 3. ¿Cómo obtener la opción seleccionada de ListPreference?
- 4. Dynamic ListPreference en android
- 5. Cómo hacer una ListPreference con la casilla de verificación
- 6. Android se bloquea en ListPreference
- 7. Forma fácil de hacer clase habilitada NSCoder
- 8. Opción múltiple en WinForms
- 9. dependencia múltiple en checkboxpreference android o listpreference's
- 10. ¿Forma fácil de construir la interfaz de usuario de Android?
- 11. ¿Forma fácil de hacer ajax cargando con clip en rieles?
- 12. Obtener la última opción cliqueada en múltiple seleccione
- 13. Opción múltiple ListView y SharedPreferences
- 14. AlertDialog de opción múltiple con adaptador personalizado
- 15. Forma de resorte: opción
- 16. ¿Cuál es la forma más fácil de hacer la negación en los desencadenantes?
- 17. Mostrando imagen en el resumen de ListPreference
- 18. Desactivar filas en ListPreference
- 19. ¿Forma fácil de reordenar columnas?
- 20. La forma más fácil de rm -rf en Python
- 21. ListPreference dependencia
- 22. ¿La forma más fácil de transformar la colección en matriz?
- 23. La forma más fácil de alternar 2 clases en jQuery
- 24. ¿Cuál es la forma más fácil de hacer comunicación entre procesos en C#?
- 25. ¿Cuál es la forma más fácil de hacer 'es' en Java?
- 26. ¿Cuál es la forma más fácil de hacer una combinación de teclas para Windows?
- 27. La forma más fácil de comparar matrices en C#
- 28. ¿La forma más fácil de leer datos formateados en C++?
- 29. ¿La forma más fácil de crear una GUI en Java?
- 30. La forma más fácil de escribir NSData en un archivo