如何在android中检测禁用复选框上的触摸事件

Posted

技术标签:

【中文标题】如何在android中检测禁用复选框上的触摸事件【英文标题】:How to detect touch events on disabled checkbox in android 【发布时间】:2012-12-18 23:03:45 【问题描述】:

我有一个带有几个复选框的layout。当一个复选框被选中时,其他复选框被设置为CHECKED=trueENABLED=false。现在我希望用户能够点击任何禁用的复选框,如果他这样做,一个设置为启用并选中,而其他所有复选框都被禁用。

当复选框设置为ENABLED=false 时,似乎不会调用onTouchListeneronClickListener。有人可以帮忙吗?

【问题讨论】:

监听器 ChkBx.setOnCheckedChangeListener.. 会被调用吗? enabled=false 表示该复选框根本不可点击。在我看来,您想要做的只是将检查更改为 false。您是否考虑过使用单选按钮?如果您一次只希望选择一个项目,这可能是一个更好的解决方案。 为什么用户应该点击禁用的复选框?我相信用户不会理解这个“功能”:) @TofferJ 我也做过。 @dieter for user 我们可以显示 toast 或警报对话框。 【参考方案1】:

您无法在禁用的复选框上接收事件。如果您将禁用的复选框放在像FrameLayout 这样的布局上,您可以在单击布局时收到事件,但不会在禁用的复选框中。例如,如果您想在禁用的复选框上捕获事件,最好的方法是简单地模拟禁用的复选框,然后捕获长按事件以再次激活。

我所做的是一个带有白色文本颜色但以灰色文本颜色开头且未选中的复选框,并带有一个布尔停止变量,您之前在每个 onCheckedChanged 方法上检查它。除非您更改布尔停止变量,否则永远不会检查复选框。您可以根据需要多次按下复选框,但没有任何反应。它似乎只是被禁用,但是当您长按时,您会取消阻止布尔停止变量并将灰色文本颜色复选框更改为白色,就像普通复选框一样。您可以在需要时更改 stopper 变量并“再次禁用它”

在 color.xml 中:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="white">#FFFFFF</color>
   <color name="grey">#808080</color>
</resources>

在 main.xml 中:

<CheckBox
      android:id="@+id/checkbox1"
      android:layout_
      android:layout_
      android:textColor="@color/white"
      android:text="text" />

在main.java代码中,onCreate方法:

//define a boolean stopper variable to check on event
boolean chkActivated = false; 

checkbox = (CheckBox) findViewById(R.id.checkbox1);
checkbox.setTextColor(getResources().getColorStateList(R.color.grey));
checkbox.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
         if(chkActivated)
             if (isChecked) 
                 //Do everthing you want when checked
             else
                //Do everthing you want when unchecked
             
         else
             checkbox.setChecked(false);
             Toast.makeText(Activity.this, "It is disabled. to activate press long click"), Toast.LENGTH_SHORT).show();
         
      
);

checkbox.setOnLongClickListener(new OnLongClickListener()  
   @Override
   public boolean onLongClick(View v) 
       chkActivated = true;
       checkbox.setTextColor(getResources().getColorStateList(R.color.white));
       checkbox.setChecked(true);
       return true;
   
);

希望对你有帮助

【讨论】:

【参考方案2】:

通常这种情况下的行为在 Android 中是一个问号。您可以做的一件事是把CheckBox 放在ViewGroup 的后裔(例如FrameLayout 等众多布局之一)并在其上使用setOnClickListener

【讨论】:

这很好用,但是,Click 事件不仅仅是从布局中生成的。这意味着,如果我单击复选框,它仍然不会传播。是否有任何设置可以使整个布局可点击?

以上是关于如何在android中检测禁用复选框上的触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

Android如何禁用触碰事件?

如何针对触控设备优化网站

Android 在视图上禁用多点触控

无法在 Android 设备上的 Javascript 中获取触摸事件的坐标

如何检测不同图像部分上的不同触摸事件

防止多点触控的 UIButton 触摸事件