当前位置: 首页 > 知识库问答 >
问题:

按下“禁用”按钮时,按钮将失去按下状态

孔俊爽
2023-03-14

我以编程方式生成了许多按钮(一些按钮用于增加值,而另一些按钮用于减少值),当它们调整的值达到最大值或最小值时,我会禁用这些按钮。(即,当达到最大值时,“增加”按钮被禁用,而当达到最小值时,“减少”按钮被禁用。)除了禁用,我还将按钮状态设置为“按下”,以直观地指示已达到极限值,并且按钮不再工作。

我的按钮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);
        }
    }
});

ClickListeners上相应的减少是相似的。

因为这些按钮正在改变它们自己的状态,所以我需要使用处理程序来调整按钮。setEnabled()按钮。setPressed()在一个小延迟之后,这样用户的手指就不会妨碍(请参见https://stackoverflow.com/a/28788780/852795)下面是上面使用的setEnabled(final按钮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(),以“拦截”关闭按下状态的触摸。然而,这也不会被调用,因为我可以想象,按钮被禁用了。

共有1个答案

督宏旷
2023-03-14

一种处理方法是使用StateListDrawable作为按钮的背景,并将禁用状态设置为使用与按下状态相同的绘图。这样您可以避免在代码中设置按下状态。

ie

<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>
 类似资料:
  • 我是一个新手,我正在尝试创建一个应用程序来在我的投资组合中使用。本质上,该程序是一个可以访问不同菜单的菜单(json文件:texas_pick.js,Breakth.js…),该程序旨在以按钮的形式显示菜单选项,按钮的详细信息从各自的json文件中检索。我面临的问题是,单击菜单选项时,会检索最后一个菜单项的数据。我将后端编程为只将商品名称和价格推送到数据库,而前端则检索这些数据并将其显示在表上。检

  • 大家好,我正在使用CodeIgniter框架,我有一个问题,在注销后,会话已经被销毁,并重定向到登录表单,并在重定向到登录表单后,浏览器返回按钮可以备份到仪表板,但有错误,因为会话是已经被摧毁了。所有我想要的是禁用浏览器的后退按钮或任何我以前不能加载的东西。我读过关于这个问题的其他帖子,并尝试了他们的解决方案,但它不起作用。我已经根据我在构造函数的其他帖子中读到的内容粘贴了这段代码。 这是我的注销

  • 由于这里的答案,我拥有了当前的设置。如何根据是否按下父按钮禁用子按钮?例如,Button2当前被禁用,但当我按下Button1时,我现在可以按下Button2,如果我按下Button2,Button3和Button4将被启用,现在可以按下。到目前为止,我的做法如下:声明一个布尔值: 单击按钮时将Enable从false更改为true: } 禁用除第一个按钮外的所有其他按钮,并且在按下按钮之前,由于

  • 所以我有这些按钮(3叠6个,18个),我想实现的是当我按下其中一个按钮时: > 边框颜色 其他按钮将重置为其正常样式 但是我不想通过“isEnable”技巧禁用其他的(我只在这里找到了涉及isEnable的解决方案),我仍然希望它们被启用,我只是希望它们不要在按下时被我的自定义样式“突出显示”。 对于第一部分,也就是我在IBAction中所做的造型: 这一小部分只是一个按钮,但我想如果我有18个按

  • 假设有几个以编程方式创建的按钮,并且有一个通用的按钮处理程序。 如何理解处理器内部哪个按钮被按下? 而不在函数调用中传递一些特殊的东西。那不行:< code > onButtonClicked(" button " I); 例如,在JavaScript中,在处理程序内部有< code>$(this),它可以立即“理解”按下了哪个按钮。 也许在颤振中也有类似的机制?我想在按钮上挂起属性(事先不知道哪

  • 问题内容: 单击后,我想在iOS上禁用按钮()。我是开发iOS的新手,但我认为目标上的等效代码-C是这样的: 但是我不能迅速做到这一点。 问题答案: Swift中的布尔值是。 应该做。 这是的属性的Swift文档。