ListPreference con un número máximo de opciones seleccionables
-
19-09-2019 - |
Pregunta
Quiero tener un elemento en mi menú de preferencias que hace lo siguiente:
- Mostrar una lista de opciones.
- Muchas son seleccionables
- Cantidad máxima de opciones a elegir 2.
Las posibilidades que pensé:
- Hacer una
PreferenceScreen
separados y mostrando opciones comocheckBoxes
, pero no sé dónde colocar la lógica del máximo 2 opciones. - La extensión
DialogPreference
y hacerlo a mano.
¿Cuál es la mejor manera?
Solución
La extensión DialogPreference
le conseguiría el más cercano en cuanto a aspecto y la sensación; las clases Preference
son bastante inflexibles y poco extensible en mi experiencia.
No puedo recordar mucho sobre PreferenceScreen
, pero me imagino que es similar.
En una aplicación que trabajé, terminamos utilizando actividades separadas, lanzados a través de un elemento Intent
Preference
onClick. Esto nos ha permitido desarrollar fácilmente las pantallas de preferencias que requieren lógica de validación de un poco más complejo que el de costumbre.
Otros consejos
Puede poner la lógica de un máximo de dos opciones en un OnSharedPreferenceChangeListener
.
Por lo que acaba de escuchar a todas las preferencias a medida que cambian y actualizarlos si se selecciona una combinación no válida.
Así que su código sería algo como lo siguiente:
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();
}
}
Si crea su propia PreferenceActivity
que implementa OnSharedPreferenceChangeListener
puede habilitar el oyente estar escuchando sólo cuando es necesario hacer algo como esto:
@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);
}