Android - 如何监听一个禁用的按钮

28

如何响应基于禁用的

10个回答

61
您可以使用#setActivated()方法来代替。禁用视图将忽略所有事件。 https://developer.android.com/reference/android/view/View.html#setActivated(boolean)。 如果需要,您可以使用android:state_activate属性自定义文本和背景样式:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="false"
      android:color="@color/a_color" />
    <item android:state_activated="true"
      android:color="@color/another_color" />
</selector>

9
这是一个相当不错的替代方案。在我看来,它应该排名更高,甚至可以成为被接受的答案。 - Levite

8

一个禁用的按钮无法响应任何事件,但是您可以通过扩展Button类来自定义自己的按钮,以制定自己的禁用定义。


34
虽然这是被接受的答案,但它并没有特别有用。 :-( - David Wasser

8

您可以重写 onTouchEvent 并创建这样的侦听器:

class MyButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = R.attr.materialButtonStyle) : MaterialButton(context, attrs, defStyleAttr) {

    private var onDisableClickListener: OnClickListener? = null

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        if (!isEnabled && event?.action == MotionEvent.ACTION_DOWN) {
            onDisableClickListener?.onClick(this)
        }
        return super.onTouchEvent(event)
    }

    fun setOnDisableClickListener(l: OnClickListener?) {
        onDisableClickListener = l
    }
}

在你的活动中:

button.setOnDisableClickListener {
            Toast.makeText(this), "The button is disabled", Toast.LENGTH_SHORT).show()
}
button.setOnClickListener {
            Toast.makeText(this), "The button is enabled", Toast.LENGTH_SHORT).show()
}

4

不要禁用它,而是保持启用状态,但使用标志来控制您的“内部状态”


请问您能否(或者有人)详细解释一下这个问题吗? - marienke
不需要添加新的标志,你可以使用按钮自己的setActivated()方法,然后用isActivated()进行检查。 - philtz

2

您可以在xml中像这样为按钮添加android:allowClickWhenDisabled属性:

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:allowClickWhenDisabled="true"/>

1
请注意,此功能仅适用于API >= 31:https://developer.android.google.cn/reference/android/view/View#setAllowClickWhenDisabled(boolean) - James

2

我通过使用一个标志来保持按钮的状态来解决了这个问题。

private boolean isMyButtonEnabled = false;

public void onMyButtonClick(View v) {
   if(isMyButtonEnabled){
      ..
   }
}

0

我找了一下,但没有找到可以监听EditText块的方法。所以我找到了另一种激活它的方式。如果有一个附近的按钮或区域已经被监听,你可以启用SetOnLongClickListener来激活该块。这将是一个秘密,但你可以告诉用户。

button.setOnLongClickListener(new OnLongClickListener() { 
        @Override
        public boolean onLongClick(View v) {
            // TODO Auto-generated method stub
            editText.setEnabled(true)
            return true;
        }
    });

enter image description here


0

我将使用selected状态来解决这个问题,该状态通常可用于小部件中,并且可以在状态列表可绘制中使用。简单搜索isSelected的用法会在ListView、GridView、TextView和TabLayout中返回结果。文档说明如下:

视图通常是在AdapterView(如ListView或GridView)的上下文中选择的;选定的视图是突出显示的视图。


0

您应该使用激活状态来启用或禁用按钮。它可以被点击,或者像某些人所说的使用选定或已选状态。每个状态都有不同的含义,因此请谨慎使用。


0

创建在 res/color/color_state.xml 中

  <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:color="#767C7F" android:state_activated="true" />
     <item android:color="#CBCBCB" android:state_activated="false" />
     <item android:color="#CBCBCB" />
  </selector>

通过以下方式设置文本颜色:

   android:textColor="@color/color_state"

将点击事件设置为更改状态颜色:

   binding.format1.setOnClickListener {
        binding.format1.isActivated = true
        binding.format2.isActivated = false
        binding.format3.isActivated = false
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接