我正在以编程方式生成多个按钮(一些用于增加值而另一些用于减少值),当他们调整的值达到最大值或最小值时,我禁用该按钮。 (即,当达到最大值时,“增加”按钮被禁用,而当达到最小值时,“减少”按钮被禁用。)除了禁用之外,我还将按钮状态设置为“按下”以便在视觉上表示已达到限制值且按钮不再起作用。
“增加”按钮的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()
,以便用户的手指不会进入方式(见https://stackoverflow.com/a/28788780/852795)。以下是上面使用的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()
}
一切都很好,有一个小例外:一旦用户按下“增加”按钮足够的时间达到最大值,按钮将被禁用,“按下”状态将被设置为真,但是,如果它被按下再一次,'压'状态将被关闭。在功能上,该按钮被禁用。我知道这是因为没有调用onClickHandler。那么为什么我的按钮会失去它的“按下”状态?我怎样才能阻止这种情况发生?
更新:看https://stackoverflow.com/a/8693444/852795我尝试插入onTouchListener()
以拦截关闭按下状态的触摸。但是,这也没有被调用,因为我想,按钮被禁用了。
答案 0 :(得分:1)
处理此问题的一种方法是使用StateListDrawable作为按钮的背景,并将Disabled状态设置为使用与Pressed状态相同的drawable。这样就可以避免在代码中设置Pressed状态。
即
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/btn_pressed" /> <!-- pressed -->
<item android:state_enabled="false" android:drawable="@drawable/btn_pressed"/> <!-- disabled (same as pressed) -->
<item android:state_enabled="true" android:drawable="@drawable/btn_normal"/>
</selector>