ListPreference con un numero massimo di opzioni selezionabili
-
19-09-2019 - |
Domanda
Voglio avere un elemento a mio menu delle preferenze che fa il seguente:
- Mostra un elenco di opzioni.
- Molti sono selezionabili
- importo massimo di opzioni da scegliere 2.
Le possibilità ho pensato di:
- Fare un
PreferenceScreen
separato e mostrando opzioni comecheckBoxes
, ma non so dove posizionare la logica del massimo 2 opzioni. - L'estensione
DialogPreference
e farlo a mano.
Qual è il modo migliore?
Soluzione
L'estensione DialogPreference
sarebbe ottenere il più vicino in termini di look-and-feel; le classi Preference
sono abbastanza poco flessibile e poco estensibile nella mia esperienza.
Non riesco a ricordare troppo di PreferenceScreen
, ma immagino che sia simile.
In un app ho lavorato, abbiamo finito con attività separate, lanciati tramite Intent
da un elemento Preference
onClick. Questo ci ha permesso di sviluppare facilmente schermi privilegiate che richiedono logica di convalida di un po 'più complesso rispetto al solito.
Altri suggerimenti
È possibile inserire la logica del massimo due opzioni in un OnSharedPreferenceChangeListener
.
Quindi, basta ascoltare tutte le preferenze che cambiano e aggiornare loro se si seleziona una combinazione non valida.
Così il vostro codice sarebbe qualcosa di simile al seguente:
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) {
//Code to calcuate how many are selected
int code = numberSelected();
if (count > 2) {
sharedPreferences.edit().putBoolean(key,false).commit();
Toast.makeText(this,"Can't select more than two!",Toast.LENGTH_LONG).show();
}
}
Se si crea il proprio PreferenceActivity
che implementa OnSharedPreferenceChangeListener
è possibile attivare l'ascoltatore ad essere solo l'ascolto quando necessario fare qualcosa di simile:
@Override
protected void onResume() {
super.onResume();
//Register the listener
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
// Unregister the listener
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}