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é:

  1. Hacer una PreferenceScreen separados y mostrando opciones como checkBoxes, pero no sé dónde colocar la lógica del máximo 2 opciones.
  2. La extensión DialogPreference y hacerlo a mano.

¿Cuál es la mejor manera?

¿Fue útil?

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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top