SwitchPreference onChecked / onClick Listener

He estado estropeando mi cerebro toda la noche, pero no puedo lograr esta pequeña cosa. Me gustaría añadir una SwitchPreference en mi PreferenceActivity de una aplicación. A continuación se muestra una imagen.

Antes de que yo diga demasiado, mi problema es exactamente esto: No puedo poner un oyente en apenas la parte del interruptor de la preferencia. Soy capaz de establecer un onPreferenceTreeClick y un onPreferenceClick en la preferencia, y que funciona bien si presiono en la parte de texto. Pero cuando el interruptor en sí no hace nada cuando lo cambio de OFF a ON.

He leído la documentación sobre SwitchPreference . También miré el android / packages / Settings y parece que AOSP usa un conmutador y no una SwitchPreference para Wi-Fi y Bluetooth.

Aquí está mi intento (trabajando si presionas todo el elemento de preferencia, pero no si presionas el conmutador):

Muestra:

public class Preferences extends SherlockPreferenceActivity { public static final String PREF_THEME = "pref_theme_interface"; public static final String PREF_ROOT = "pref_root"; public static final String PREF_APP = "pref_app"; public static SharedPreferences mTheme; private static SharedPreferences mUpdate; public static SharedPreferences.Editor mEditor; public boolean SDK_COMPAT = true; boolean pSwitch = false; boolean update = true; Preference autoUpdate; @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: this.finish(); break; } return super.onOptionsItemSelected(item); } @Override protected void onCreate(Bundle savedInstanceState) { setTheme(MainActivity.THEME); super.onCreate(savedInstanceState); final ActionBar actionBar = getSupportActionBar(); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setIcon(R.drawable.ic_preferences); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { SDK_COMPAT = false; } mUpdate = PreferenceManager.getDefaultSharedPreferences(this); update = mUpdate.getBoolean("update", false); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.preferences); setPreferenceScreen(createPreferenceSDK()); } private PreferenceScreen createPreferenceSDK() { // Root PreferenceScreen root = (PreferenceScreen)findPreference(PREF_ROOT); PreferenceCategory prefApp = (PreferenceCategory)findPreference(PREF_APP); //root.addPreference(prefApp); if (SDK_COMPAT == true) { pSwitch = true; autoUpdate = new SwitchPreference(this); autoUpdate.setKey("auto_update_pref"); autoUpdate.setTitle(R.string.auto_update); //autoUpdate.setSummary(update == false ? "Disabled" : "Enabled"); prefApp.addPreference(autoUpdate); } else { pSwitch = false; autoUpdate = new CheckBoxPreference(this); autoUpdate.setKey("auto_update_pref"); autoUpdate.setTitle(R.string.auto_update); autoUpdate.setSummary(R.string.auto_update_summary); prefApp.addPreference(autoUpdate); } autoUpdate.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { mEditor = mUpdate.edit(); boolean checked = ((SwitchPreference) preference) .isChecked(); if (checked) { update = true; mEditor.putBoolean("update", true); mEditor.commit(); autoUpdate.setSummary(update == false ? "Disabled" : "Enabled"); } else { update = false; mEditor.putBoolean("update", false); mEditor.commit(); autoUpdate.setSummary(update == false ? "Disabled" : "Enabled"); } return true; } }); return root; } 

Así que para reiterar mi pregunta en caso de que te perdiera. ¿Cómo se establece un oyente en la parte Switch de la SwitchPreference? Por favor sea amable si es algo tan obvio. Era bastante tarde anoche cuando traté de añadir esto.

Muchas gracias de antemano.

Notas: 1. No me opongo a pegar con la CheckBoxPreference, pero prefiero usar Switch porque se ve bien.

  1. Sí sé que hay un más fácil / mejor? Forma de agregar preferencia dinámica utilizando res / xml y res / xml-v14 en lugar de hacer la comprobación de SDK. Acabo de hacer eso para las pruebas.

Imagen de la pantalla de preferencias

EDITAR

Espero que esto ayude a otra persona! Gracias Tushar por sugerencia 🙂

 autoUpdate.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { boolean switched = ((SwitchPreference) preference) .isChecked(); update = !switched; mEditor = mUpdate.edit(); mEditor.putBoolean("update", update); mEditor.commit(); autoUpdate.setSummary(update == false ? "Disabled" : "Enabled"); return true; } }); 

Utilice setOnPreferenceChangeListener() lugar de setOnPreferenceClickListener() .

Código de trabajo

 public static class SettingsFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_notification); SwitchPreference vibrateSwitch = (SwitchPreference) findPreference("notification_vibrate"); if (vibrateSwitch != null) { vibrateSwitch.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference arg0, Object isVibrateOnObject) { boolean isVibrateOn = (Boolean) isVibrateOnObject; if (isVibrateOn) { Vibrator v = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE); v.vibrate(400); } return true; } }); } } } 

Si todavía no ha descubierto una buena manera de hacerlo, he descubierto algo que no crea múltiples llamadas a onPreferenceChange que haga clic en la preferencia. Lo escribí en otra pregunta: la funcionalidad dual SwitchPreference .

  • Android lolipop java.lang.SecurityException: Ni el usuario ni el proceso actual tiene android.permission.BLUETOOTH_PRIVILEGED
  • No se puede reproducir este video. Android videoView mp4 grabado por el dispositivo Android
  • conexión de base de datos mysql con jabón webservices en android
  • Cómo cargar matriz de cadena en un fragmento?
  • Uso de XML simple y obtención de NoClassDefFoundError en Android
  • Firebase: ¿una forma limpia de usar campos enum en Kotlin / Java?
  • Devolver datos de la clase AsyncTask
  • Android bloqueo en el curriculum vitae. ¿Cómo interpretar esta excepción?
  • Restaurar la pila de aplicaciones de Android desde el fondo
  • No se puede enviar o recibir presencia con ASmack
  • El título de ViewPager no aparece hasta que lo deslice
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.