Java SwitchPreference onChecked/onClick侦听器
我整晚都在绞尽脑汁,但似乎无法完成这件小事。我想将SwitchPreference添加到我的应用程序PreferenceActivity中。下面是一张照片 在我说得太多之前,我的问题就是:我似乎不能让一个听众只参与偏好的切换部分。我可以在首选项上设置on PreferenceTreeClick和on PreferenceClick,如果我按下文本部分,效果会很好。但是当我把开关从OFF换成ON时,开关本身什么也不起作用 我已经阅读了有关的文档。我还查看了android/软件包/设置,AOSP似乎使用了一个交换机,而不是Wi-Fi和蓝牙的首选交换机 以下是我的尝试(如果您按下整个首选项,但如果您只按下开关,则无法工作): 样本:Java SwitchPreference onChecked/onClick侦听器,java,android,Java,Android,我整晚都在绞尽脑汁,但似乎无法完成这件小事。我想将SwitchPreference添加到我的应用程序PreferenceActivity中。下面是一张照片 在我说得太多之前,我的问题就是:我似乎不能让一个听众只参与偏好的切换部分。我可以在首选项上设置on PreferenceTreeClick和on PreferenceClick,如果我按下文本部分,效果会很好。但是当我把开关从OFF换成ON时,开关本身什么也不起作用 我已经阅读了有关的文档。我还查看了android/软件包/设置,AOSP似乎
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;
}
使用
setOnPreferenceChangeListener()
而不是setOnPreferenceClickListener()
如果您仍然没有找到一个好方法来执行此操作,我已经找到了一些方法,它不会像单击首选项那样创建对onPreferenceChange
的多个调用。我在另一个问题中写道:。工作代码
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;
}
});
}
}
}
你试过使用setOnPreferenceChangeListener吗?Tushar,实际上我没有试过。让我试一试。谢谢。告诉我进展如何。我很好奇。谢谢你的建议。这就是我所做的,它似乎工作正常。不过,有一件事很有趣。它的回报与我的预期相反。。。我用methodYeah编辑了原始问题,在我看来,切换按钮在UI中是非常不受欢迎的,因为它们很难通过快速浏览来判断(例如:“打开”文本是指它打开了,还是意味着我可以打开它?)。我将提交我的解决方案作为答案,以便其他人可以更容易地找到它。
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;
}
});
}
}
}