【问题标题】:Disabled button loses pressed state when touched禁用按钮在触摸时失去按下状态
【发布时间】: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


【解决方案1】:

处理此问题的一种方法是使用 StateListDrawable 作为按钮的背景,并将 Disabled 状态设置为使用与 Pressed 状态相同的可绘制对象。这样您就可以避免在代码中设置 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2019-05-29
    相关资源
    最近更新 更多