He estado trabajando en mi cerebro toda la noche, pero parece que no puedo lograr esta pequeña cosa. Me gustaría agregar SwitchPreference a mi actividad de preferencia de una aplicación. Debajo hay una imagen.SwitchPreference onChecked/onClick Listener
Antes de decir demasiado, mi problema es exactamente esto: parece que no puedo poner a un oyente solo en la parte de Cambio de la preferencia. Puedo establecer un onPreferenceTreeClick y un onPreferenceClick en la preferencia, y eso funciona bien si presiono sobre la parte del texto. Pero cuando el Switch en sí no hace nada cuando lo cambio de OFF a ON.
He leído la documentación en SwitchPreference. También miré el android/packages/Settings y parece que AOSP usa un Switch y no un SwitchPreference para Wi-Fi y Bluetooth.
Aquí está mi intento (de trabajo si se pulsa sobre la totalidad del elemento de preferencias, pero no si sólo tiene que pulsar el interruptor):
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í reiterar mi pregunta en caso de que Ha perdido. ¿Cómo se establece un oyente en la porción Switch de SwitchPreference? Por favor, sé amable si es algo tan obvio. Anoche fue bastante tarde cuando traté de agregar esto.
Muchas gracias de antemano.
Notas: 1. No me opongo a seguir con CheckBoxPreference, pero prefiero usar Switch porque se ve bien.
- Sí, sé que hay un más fácil/mejor? forma de agregar preferencias dinámicas usando res/xml y res/xml-v14 en lugar de hacer la comprobación de SDK. Solo lo hice para probar.
EDITAR
Esperamos que esto ayude a alguien más! Gracias a la sugerencia Tushar :-)
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;
}
});
¿Ha intentado utilizar setOnPreferenceChangeListener en su lugar? – Tushar
Tushar, en realidad no lo he intentado. Déjame probarlo. Gracias. – tommytomatoe
dime cómo va. Soy curioso. – Tushar