我整夜都在绞尽脑汁,但似乎无法完成这一小事情。我想将SwitchPreference添加到我的应用程序的PreferenceActivity中。下面是一张图片。
在我说太多之前,我的问题恰好是这样的:我似乎无法仅在首选项的Switch部分上放置一个侦听器。我可以在首选项上设置onPreferenceTreeClick和onPreferenceClick,如果按文本部分,效果很好。但是,当我将开关从OFF更改为ON时,Switch本身什么也不做。
我已经阅读了SwitchPreference上的文档。我还查看了android / packages / Settings,看起来AOSP使用的是Switch,而不是Wi-Fi和Bluetooth的SwitchPreference。
这是我的尝试(如果您按整个首选项,则可以,但是如果您只按Switch,则不可以):
样品:
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的Switch部分上设置侦听器?如果它是如此明显,请好心。昨晚很晚,当我尝试添加此内容时。
提前非常感谢您。
注意:1.我不反对坚持使用CheckBoxPreference,但是我更喜欢使用Switch,因为它看起来不错。
偏好屏幕的图片
编辑
希望这可以帮助其他人!感谢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; } });
使用setOnPreferenceChangeListener()代替setOnPreferenceClickListener()。
setOnPreferenceChangeListener()
setOnPreferenceClickListener()