【发布时间】:2016-09-25 04:23:00
【问题描述】:
我正在以编程方式生成许多按钮(一些用于增加值,而另一些用于减少值)当它们调整的值达到最大值或最小值时我将其禁用。 (即,当达到最大值时禁用“增加”按钮,而当达到最小值时禁用“减小”按钮。)除了禁用之外,我还将按钮状态设置为“按下”以便在视觉上表示已达到限制值,按钮不再起作用。
“增加”按钮的 onClickListener 按钮如下所示:
increase.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// do some stuff
// here I enable the corresponding 'decrease' button because once you increase you can then decrease
setEnabled(decrease, true);
// if the maximum value is obtained, I disable the 'increase' button because you can't go higher
if (value == maximum) {
setEnabled(increase, false);
}
}
});
相应的'减少' onClickListeners 类似。
因为这些按钮都在改变自己的状态,所以我需要使用Handler 来调整Button.setEnabled() 和Button.setPressed() 在一小段延迟之后,让用户的手指不碍事(见@987654321 @)。这是上面使用的setEnabled(final Button b, final boolean set) 方法:
private void setEnabled(final Button b, final boolean set) {
Handler refresh = new Handler(Looper.getMainLooper());
refresh.postDelayed(new Runnable() {
@Override
public void run() {
b.setEnabled(set);
b.setPressed(!set);
}
}, 250); // delayed post required to make pressed button accept setPressed()
}
一切都很好,除了一个小例外:一旦用户按下“增加”按钮的次数达到最大值,该按钮将被禁用并且“按下”状态将设置为 true,但是,如果它随后被按下再一次,“按下”状态将被关闭。在功能上,该按钮被禁用。我知道这一点,因为 onClickHandler 没有被调用。那为什么我的按钮会失去它的“按下”状态?我怎样才能阻止这种情况发生?
更新:查看https://stackoverflow.com/a/8693444/852795 我尝试插入onTouchListener() 以“拦截”关闭按下状态的触摸。但是,这也没有被调用,因为我想,按钮被禁用了。
【问题讨论】:
-
我不认为当按钮被禁用时你可以使用按下状态。
-
处理此问题的更可靠方法可能是将按钮背景更改为 StateListDrawable,并将其“禁用”状态设置为与其“按下”状态相同。 developer.android.com/guide/topics/resources/…
-
按钮被禁用,按下状态设置为'true',一切正常。如果然后再次按下(禁用时!),按下状态将关闭。
-
尝试覆盖按钮的 OnTouchListener,如果按钮被禁用,不要调用 super.onTouch
-
@Egg StateListDrawable 就是答案。我只需要将
<item android:drawable="@drawable/overlay_button_pressed" android:state_enabled="false"/>添加到我的按钮选择器中。 1行修复!随时发布答案以领取您的奖品。谢谢!
标签: android button onclicklistener ontouchlistener