android - 禁用按钮在触摸时失去按下状态

标签 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()
}

一切都很好,除了一个小异常(exception):一旦用户按下“增加”按钮的次数足够多以达到最大值,该按钮将被禁用并且“按下”状态将设置为 true,但是,如果它随后被按下再一次,“按下”状态将被关闭。在功能上,该按钮被禁用。我知道这是因为没有调用 onClickHandler。为什么我的按钮会失去它的“按下”状态?我怎样才能阻止这种情况发生?

更新:查看https://stackoverflow.com/a/8693444/852795我尝试插入 onTouchListener() 以“拦截”关闭按下状态的触摸。但是,这也不会被调用,因为我想,该按钮被禁用了。

最佳答案

处理此问题的一种方法是使用 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>

关于android - 禁用按钮在触摸时失去按下状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39683346/

相关文章:

java - 如何比较 java swing 按钮图标以检查相等性?

javascript - $(document).on ('click' 多次触发

Android-NDK:从 native 代码创建 GUI 元素

Android - 单击另一个时禁用对话框中的所有其他项目

android - 如何绕过 Powershell 脚本中的安装向导直接启动 Android Studio 的可移植安装?

android - 处理 RecyclerView 适配器中的按钮单击?

java - 监听器接口(interface)无法与回收器 View 中的卡片 View 的 onClick 配合使用

android - AsyncTask onPostExecute - 新的 Intent 错误

jquery - 选择后更改按钮的外观

android - 在android中的onClick按钮中选择和取消选择