【问题标题】:Can I make a button appear disabled and still listen for clicks?我可以让按钮显示为已禁用并仍然监听点击吗?
【发布时间】:2012-06-06 20:41:45
【问题描述】:

我想将一个按钮设为灰色,使其对用户显示为已禁用,但仍会监听点击,以便向用户显示一条消息,说明该按钮为何不适用。

我想确保 Android API 能够配置适当的标准禁用外观,而不是手动将按钮颜色设置为灰色等。最好的方法是什么?

相关:Android - Listen to a disabled button

【问题讨论】:

    标签: android


    【解决方案1】:

    我不是 Android 专家,所以可能有更好的方法,但是禁用按钮并覆盖将捕获事件的透明视图怎么样?

    您可以让视图始终位于按钮下方,因此您只需更改 z-index,或在需要时动态创建它。

    【讨论】:

    • garph,这是一个有趣的想法——我敢打赌它会奏效。不过,我首先要尝试其他几个解决方案。
    【解决方案2】:

    您还可以手动将 Button 的背景设置为禁用的默认背景。但是让按钮保持启用状态并以正常方式处理点击事件

    应该这样做:

    mBtn.setBackgroundResource(android.R.drawable.btn_default_normal_disabled);
    

    【讨论】:

      【解决方案3】:

      您还可以将Button 的样式设置为灰显(对于按下和未按下状态),然后将setOnClickListener() 设置为正常,但让onClick() 方法给出它不是的消息不可点击。

      【讨论】:

        【解决方案4】:

        由于按钮扩展了文本视图。您可以使用 textview 中的方法,例如 .setTextColor() 或 .setBackgroundColor() 。

        现在对于显示器,您有 2 个选项:

        • AlertDialog - 显示警报,但除非指定,否则不会自行关闭。
        • Toast - 在给定时间内显示文本并自行关闭。

        任君挑选。

        【讨论】:

        • Juju,谢谢,但您一定没有读到我确实想手动更改颜色的问题。
        【解决方案5】:

        这是自定义按钮,在禁用时会显示触摸事件 它确实有效,并且经过测试。专为您设计

        public class MyObservableButton extends Button
        {
        public MyObservableButton(Context context, AttributeSet attrs)
        {
            super(context, attrs);
        }
        
        private IOnClickWhenEnabledListner mListner;
        
        public void setOnClickWhenEnabledListener(IOnClickWhenEnabledListner listener) {
            mListner = listener;
        }
        
        private interface IOnClickWhenEnabledListner {
            public void onClickWhenEnabled();
        }
        
        @Override
        public boolean onTouchEvent(MotionEvent event)
        {       
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                if (!isEnabled() && mListner != null) {
                    mListner.onClickWhenEnabled();
                }
            }
        
            return super.onTouchEvent(event);
        }
        
        }
        

        从我作为 android 开发人员的角度来看,这是完成您想要的事情的正确方法。

        扩展所有android的视图没有问题,并在xml文件上使用它们,而不是源..

        祝你好运

        【讨论】:

        • 你可以避免额外的监听器,只使用 OnClickListener。在 onTouchEvent() 中添加 performClick()
        【解决方案6】:

        如果您的按钮是通过backgroundTint 而不是background 控制颜色的较新类型,那么您应该这样做:

        if (enabled) {
            ViewCompat.setBackgroundTintList(btn, getResources().getColorStateList(R.color.button_states)); // either use a single color, or a state_list color resource
        } else {
            ViewCompat.setBackgroundTintList(btn, ColorStateList.valueOf(Color.GRAY));
        }
        // make sure we're always clickable
        btn.setEnabled(true);
        btn.setClickable(true);
        

        【讨论】:

          猜你喜欢
          • 2016-09-03
          • 2013-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-04
          相关资源
          最近更新 更多