Я всю ночь ломаю мозги, но, похоже, не могу выполнить эту маленькую вещь. Я хотел бы добавить 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, потому что он выглядит хорошо.
- Да, я знаю, что есть легче/лучше? способ добавления динамических предпочтений с использованием res/xml и res/xml-v14 вместо проверки SDK. Я просто сделал это для тестирования.
ИЗМЕНИТЬ
Надеюсь, это поможет кому-то еще! Спасибо 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;
}
});