【发布时间】:2017-01-27 20:55:45
【问题描述】:
我正在尝试使用共享首选项切换按钮,这样当我打开我的应用程序时,就会显示相应的按钮。 这是我设置和获取共享首选项的代码:
private void setRequestUpdatesButtonState(boolean state) {
PreferenceManager.getDefaultSharedPreferences(this)
.edit()
.putBoolean(Constants.PREF_IS_BUTTON_PRESSED, state)
.apply();
}
private boolean getRequestUpdatesButtonState() {
return PreferenceManager.getDefaultSharedPreferences(this)
.getBoolean(Constants.PREF_IS_BUTTON_PRESSED, false);
}
然后在 onCreate 方法中,我检查共享首选项以显示适当的按钮:
if(getRequestUpdatesButtonState()) {
mRequestRemoveUpdates.setCircleRadius(34);
mRequestRemoveUpdates.setImageResource(R.drawable.ic_cancel);
}
else {
mRequestRemoveUpdates.setCircleRadius(34);
mRequestRemoveUpdates.setImageResource(R.drawable.ic_start);
}
同样在 onClick 方法中,当按钮被点击时,我会根据情况更改共享首选项,以及按钮图像本身:
if(getRequestUpdatesButtonState()) {
boolean updatesRequested = true;
setRequestUpdatesButtonState(updatesRequested);
mRequestRemoveUpdates.setCircleRadius(34);
mRequestRemoveUpdates.setImageResource(R.drawable.ic_cancel);
}
else {
boolean updatesRequested = false;
setRequestUpdatesButtonState(updatesRequested);
mRequestRemoveUpdates.setCircleRadius(34);
mRequestRemoveUpdates.setImageResource(R.drawable.ic_start);
}
但它不起作用。 显然,我需要摆脱代码重复,但我一开始正在努力使其正常运行,我正在努力实现;然后我会清理它。
【问题讨论】:
-
似乎是一个逻辑问题。您希望您的开关切换,但不知何故您并没有在您的
onClick方法中真正“切换”它。在 onClick 的 if..else.. 语句中反转你的逻辑并尝试。 -
我使用 CircledImageView 作为按钮,在我的 getRequestUpdatesButtonState 中我使用 false 作为默认值,然后在 onClick 中我将共享首选项从 false 更改为 true,反之亦然,我也更改了按钮图像: mRequestRemoveUpdates.setImageResource(R.drawable.ic_cancel);或 mRequestRemoveUpdates.setImageResource(R.drawable.ic_start);更改按钮图像用作切换
-
不管你使用什么默认值。在您的
onClick方法中,您使用getRequestUpdatesButtonState()从SharedPreferences读取值。它告诉您您当前的状态是true(或错误),并且您仍在尝试使用相同的状态对其进行更新。简而言之,您没有切换它。 -
好的,那么使用这样的东西是否正确: boolean something = !getRequestUpdatesButtonState() 然后将该值放入: setRequestUpdatesButtonState(something) ,然后添加相反的布尔值,或者我还是错了吗?
-
试试就知道了。记得反转你的
View逻辑以获得正确的视觉反馈。