SwitchPreference onChecked / onClick Listener

Я всю ночь ломаю мозги, но, похоже, не могу выполнить эту маленькую вещь. Я хотел бы добавить SwitchPreference в мою PreferenceActivity приложения. Ниже приведена картина.

Прежде чем я говорю слишком много, моя проблема заключается именно в этом: я не могу показаться, что слушаю только часть переключателя предпочтения. Я могу установить onPreferenceTreeClick и onPreferenceClick в предпочтении, и это отлично работает, если я нажимаю на текстовую часть. Но когда сам переключатель ничего не делает, когда я меняю его с OFF на ON.

Я прочитал документацию по SwitchPreference . Я также посмотрел на android / packages / Settings, и похоже, что AOSP использует Switch, а не SwitchPreference для Wi-Fi и Bluetooth.

Вот моя попытка (работает, если вы нажмете на весь элемент предпочтения, но не, если вы просто нажмете переключатель):

Образец:

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; } 

Поэтому повторю свой вопрос, если я потерял тебя. Как установить слушателя на коммутационную часть SwitchPreference? Пожалуйста, будьте добры, если это так очевидно. Это было довольно поздно прошлой ночью, когда я попытался добавить это.

Огромное спасибо заранее.

Примечания: 1. Я не против придерживаться CheckBoxPreference, но я предпочитаю использовать Switch, потому что он выглядит хорошо.

  1. Да, я знаю, что есть легче / лучше? Способ добавления динамических предпочтений с использованием res / xml и res / xml-v14 вместо проверки SDK. Я просто сделал это для тестирования.

Изображение экрана предпочтений

РЕДАКТИРОВАТЬ

Надеюсь, это поможет кому-то еще! Спасибо Тушару за предложение 🙂

 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; } }); 

Solutions Collecting From Web of "SwitchPreference onChecked / onClick Listener"

Используйте setOnPreferenceChangeListener() вместо setOnPreferenceClickListener() .

Рабочий код

 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; } }); } } } 

Если вы все еще не поняли хороший способ сделать это, я понял что-то, что не создает несколько вызовов onPreferenceChange которые onPreferenceChange на предпочтение. Я написал это в другом вопросе: двойная функциональность SwitchPreference .