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.
- Píxeles a las inmersiones, al escritorio y al android
- ¿Es esta una forma válida de mantener una referencia estática y Actividad / Contexto? ¿Por qué no debo hacer esto?
- PreferenceFragment.findPreference devuelve siempre NULL
- Las clases siguientes no pudieron ser instanciadas: - android.support.v7.widget.Toolbar
- StartActivityForResult de un servicio
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.
- 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; } });
- ¿Cómo puedo obtener la ruta relativa de las carpetas en mi proyecto android?
- Java Java crea mapa de bits a partir del valor hexadecimal
- Longitud de la polilla de Google Maps Android api v2
- Búsqueda asistida por Android: El botón de búsqueda no invoca la actividad que se puede buscar (Otras soluciones no ayudaron)
- Lista de desplazamiento infinito de Android en ambas direcciones
- Android Development: Obtención de datos desde la Web
- No se puede depurar, señal fatal 6 (SIGABRT) en 0x00007c37 (código = -6)
- Las alarmas set () y setExact () de Android disparan a intervalos incorrectos
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 .
- Utilice ItemTouchHelper para deslizar-a-despedir con otra vista que se muestra detrás del barrido hacia fuera
- Uso de Enums como atributos XML personalizados