2011-05-02 19 views
6

Tengo un PreferenceScreen que contiene solo CheckBoxPreferences (categorías para seleccionar). Necesito una opción para marcar/desmarcar todos ellos. Tengo el siguiente código que hace el trabajo, pero hay un problema: las casillas de verificación en la pantalla no están actualizadas. Tendría que llamar a alguna invalidación en la vista o algo así.Android CheckBoxPreference - un/check all preferences

Aquí está mi código actual:

private void checkAll() { 
     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 
     SharedPreferences.Editor editor = settings.edit(); 
     @SuppressWarnings("unchecked") 
     Map<String, Boolean> categories = (Map<String, Boolean>) settings.getAll(); 
     for(String s : categories.keySet()) { 
      editor.putBoolean(s, true); 
     } 
     editor.commit(); 
    } 

    private void uncheckAll() { 
     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 
     SharedPreferences.Editor editor = settings.edit(); 
     @SuppressWarnings("unchecked") 
     Map<String, Boolean> categories = (Map<String, Boolean>) settings.getAll(); 
     for(String s : categories.keySet()) { 
      editor.putBoolean(s, false); 
     } 
     editor.commit(); 
     this.restart(); 
    } 

Este código funciona bien, pero que había necesidad de actualizar la vista de alguna manera para ver el resultado imediatelly (no sólo después de cerrar y volver a iniciar la actividad ajustes).

¡Gracias a todos por cualquier consejo!

Respuesta

14

Eso es porque en realidad no está agarrando los objetos de preferencia, solo los valores reales. Pruebe esto en su bucles:

boolean theValue = param; 
for(String s : categories.keySet()) { 
    Preference pref = findPreference(s); 
    if (pref instanceof CheckBoxPreference) { 
     CheckBoxPreference check = (CheckBoxPreference)pref; 
     check.setChecked(theValue); 
    } 
    } 

Creo que se puede omitir llamar el editor y el compromiso, como el setChecked() lo hará por ti.

Compruebe this fuera también.

+0

muchas gracias, que fue brillante !!! – shadyyx

+0

Solo para información: Aunque obsoleto de HoneyComb este código funcionará hasta ICS, no funciona con Jelly Bean. – AliR

+0

¿Qué parte no funciona con Jelly Bean? Comprobé 'findPreference' y' setChecked' y no están marcados para desactivarse a partir de 4.1.1. – dmon

0

Ahora tengo este código de trabajo, tal vez va a ayudar a alguien:

import ... 

public class CategoriesActivity extends PreferenceActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.category_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.categories_check_all: 
       this.checkAll(); 
       return true; 
      case R.id.categories_uncheck_all: 
       this.uncheckAll(); 
       return true; 
     } 
     return false; 
    } 

    private void checkAll() { 
     this.setCheckState(true); 
    } 

    private void uncheckAll() { 
     this.setCheckState(false); 
    } 

    private void setCheckState(Boolean state) { 
     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 
     @SuppressWarnings("unchecked") 
     Map<String, Boolean> categories = (Map<String, Boolean>) settings.getAll(); 
     for (String s : categories.keySet()) { 
      Preference pref = findPreference(s); 
      if (pref instanceof CheckBoxPreference) { 
       CheckBoxPreference check = (CheckBoxPreference) pref; 
       check.setChecked(state); 
      } 
     } 

    } 
} 
Cuestiones relacionadas