Sto provando a creare una finestra di dialogo delle preferenze che consente all'utente di selezionare più di un elemento nell'elenco. Attualmente consente solo di selezionare un elemento. C'è un modo semplice per farlo? Ho guardato su internet e non ho ancora visto un modo. Qualsiasi aiuto è apprezzato!Un modo semplice per rendere ListPreference una scelta multipla in Android?
risposta
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.
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);
}
}
}
}
Per quali Android-Api-livello vuoi questo?
Quando si utilizza API livello 11 è possibile utilizzare questo MultiSelect Preference for Android 3.0 or higher
Quando si utilizza API-livello più piccolo 11 si può usare questa Custom Implementation of MuliiSelect Preference
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.
- 1. Casella di scelta multipla HTML
- 2. Android okHttp addFormDataPart in modo dinamico per Immagine multipla
- 3. GridView all'interno di ExpandableListView con scelta multipla su Android
- 4. Elenco a scelta multipla con visualizzazione personalizzata?
- 5. modo semplice per rinominare un progetto in Android
- 6. Vuoi un modo semplice e veloce per rendere più veloci le zecche di una trama 3D
- 7. modo più semplice per analizzare una data in Javascript
- 8. C'è un modo per rendere atomica una funzione in C? .
- 9. Scelta ponderata breve e semplice
- 10. Qual è il modo più semplice per creare un tasto di scelta rapida per Windows?
- 11. Un modo semplice per riprodurre una singola frequenza in java?
- 12. modo semplice per convertire una stringa in un dizionario
- 13. AlertDialog a scelta multipla con adattatore personalizzato
- 14. ListPreference dipendenza
- 15. Come compilare ListPreference in modo dinamico quando viene attivato onPreferenceClick?
- 16. In Scala, c'è un modo semplice per convertire una classe di case in una tupla?
- 17. Un modo semplice per costruire un'interfaccia utente Android?
- 18. cammello Java DSL scelta in una scelta
- 19. modo RESTful ad accettare una scelta
- 20. Arresto anomalo di Android su ListPreference
- 21. modo più semplice per usare svg in Android?
- 22. C'è un modo per rendere dinamicamente una versione nascosta di un campo django in un modello?
- 23. ASP.NET: il modo più semplice per rendere DataTable a una stringa (HTML)?
- 24. Un modo semplice per disabilitare un UITextField?
- 25. Un modo semplice per eseguire test su una gemma?
- 26. C'è un modo per rendere viste parziali in WebForms?
- 27. Modo più semplice per trasformare un DOMSource in un StreamSource?
- 28. Un modo semplice per popolare questa matrice?
- 29. Esiste un modo semplice per randomizzare un elenco in VB.NET?
- 30. Un modo per rendere md5_file() più veloce?