触摸时,已禁用按钮会失去按下状态

时间:2016-09-25 04:23:01

标签: android button onclicklistener ontouchlistener

我正在以编程方式生成多个按钮(一些用于增加值而另一些用于减少值),当他们调整的值达到最大值或最小值时,我禁用该按钮。 (即,当达到最大值时,“增加”按钮被禁用,而当达到最小值时,“减少”按钮被禁用。)除了禁用之外,我还将按钮状态设置为“按下”以便在视觉上表示已达到限制值且按钮不再起作用。

“增加”按钮的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()以拦截关闭按下状态的触摸。但是,这也没有被调用,因为我想,按钮被禁用了。

1 个答案:

答案 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>