- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据 the Android guide我正在尝试使用首选项 fragment 来实现首选项。在 preferences.xml 中我声明:
<SwitchPreference
android:key="enable_wifi"
android:title="Enable WiFi"
/>
比起在类中,我在 onCreate 方法中扩展了 PreferenceFragment:
public class FragmentSettings extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
mEnableWifi = (SwitchPreference) findPreference(enable_wifi);
mEnableWiFi.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Log.i(getClass().getName(), preference.getKey()
+ String.valueOf(newValue));
}
}
因此,当我点击 SwitchPreferene 或 Switch inside log shows 时,我得到了结果
enable_wifi false
enable_wifi false
enable_wifi true
enable_wifi true
这就是为什么我认为监听器被多次调用的原因。如何处理或修复它?
最佳答案
这是由于 SwitchPreference
实现中的错误。
调用回调 onPreferenceChange
:
SharedPreference
。Switch
小部件的切换状态。 Here它被调用。无法评论逻辑,但至少框架应该只在状态发生变化时调用 onPreferenceChange
回调。所以责任在我们。使用 SwitchPreference.isChecked检查状态是否发生变化的方法。
public boolean onPreferenceChange(Preference preference, Object newValue) {
if(((SwitchPreference) preference).isChecked() != (Boolean) newValue) {
// State got changed
Log.i("Testing", preference.getKey() + " : " + String.valueOf(newValue));
// If you don't want to save the preference change return false from this if block.
}
return true;
}
这是供您引用的调用堆栈:
TwoStatePreference.onClick :
MainActivity$SettingsFragment$1.onPreferenceChange(Preference, Object) line: 45
SwitchPreference(Preference).callChangeListener(Object) line: 895
SwitchPreference(TwoStatePreference).onClick() line: 65
SwitchPreference(Preference).performClick(PreferenceScreen) line: 950
PreferenceScreen.onItemClick(AdapterView, View, int, long) line: 215
ListView(AdapterView).performItemClick(View, int, long) line: 298
ListView(AbsListView).performItemClick(View, int, long) line: 1100
AbsListView$PerformClick.run() line: 2788
AbsListView$1.run() line: 3463
Handler.handleCallback(Message) line: 730
ViewRootImpl$ViewRootHandler(Handler).dispatchMessage(Message) line: 92
Looper.loop() line: 137
切换小部件切换:
MainActivity$SettingsFragment$1.onPreferenceChange(Preference, Object) line: 45
SwitchPreference(Preference).callChangeListener(Object) line: 895
SwitchPreference$Listener.onCheckedChanged(CompoundButton, boolean) line: 47
Switch(CompoundButton).setChecked(boolean) line: 126
Switch.setChecked(boolean) line: 666
SwitchPreference.onBindView(View) line: 106
关于android - SwitchPreferences 多次调用 onPreferenceChange() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19503931/
我有一个带有 MultiSelectListPreference 的 Android 应用程序,我正在使用 onPreferenceChange() 方法来更新首选项的摘要。我已经设法编写了根据 ne
我是 Android 开发新手。在我的应用中,当用户更改首选项时,应该调用一个函数来更新一些变量。 这是我当前的代码: mypref.setOnPreferenceChangeListener(
我正在开发自定义 ROM,但在尝试编译时收到此错误。我尝试添加自定义电池选择器。 com.android.settings.pcf.StatusBar is not abstract and does
根据 the Android guide我正在尝试使用首选项 fragment 来实现首选项。在 preferences.xml 中我声明: 比起在类中,我在 onCreate 方法中扩展了 Pre
我的代码中有一个首选项 Activity 。我想在用户更改 ListPreferences 中的单选按钮时 toast 。我使用了这段代码,但它不起作用。 :( public class PrefsA
我有一个名为 MyDialogPreference 的 DialogPreference 子类,当我单击 DialogInterface.BUTTON_POSITIVE 时,它有两个用于用户名和密码的
在 SettingsActivity 中自动生成的一些代码如下所示(缩略版): private static Preference.OnPreferenceChangeListener sBindPr
我一直在尝试让 Android 中的开关首选项起作用,这样我就可以拦截和处理不同的情况,在某些情况下,当他们打开/关闭它时与他们单击整个首选项时。 这就是我想要完成的:用户进入首选项标签已关闭且未存储
当对话框关闭时,从 PreferenceActivity 调用的自定义 DialogPreference 不会调用 OnPreferenceChange()。 我认为 persistXXXX() 是触
我一直在尝试制作一个 Android 设置屏幕,其中包含一些 SeekBarPreferences,以选择从 0 到 10 的三个数字。但是,我的 OnPreferenceChanged 代码没有被调
我一直在使用 ScrollView 看到首选项键的一些奇怪行为。如果我把 onPreferenceChange内ScrollView它不会被调用,但如果我把它放在外面它会! 我已经设置了一个宽度首选项
我正在开发 Android 2.2 应用程序,我将使用 Preference.OnPreferenceChangeListener 接口(interface)。 我已将以下代码添加到我的偏好 Acti
我是一名优秀的程序员,十分优秀!