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

3
我有一个带有几个复选框的布局。当一个复选框被选中时,其他复选框将被设置为CHECKED=trueENABLED=false。现在我希望用户能够点击任何一个禁用的复选框,如果这样做,其中一个将被启用并选中,所有其他复选框都将被禁用。
当复选框被设置为ENABLED=false时,onTouchListeneronClickListener似乎都不会被调用。有谁可以帮忙吗?

监听器 ChkBx.setOnCheckedChangeListener 怎么样?它会被调用吗? - Gridtestmail
1
enabled=false 表示复选框根本无法点击。听起来你想做的只是将 checked 改为 false。你考虑过使用单选按钮吗?如果你只想选择一个项目,那么这可能是更好的解决方案。 - TofferJ
为什么用户要点击禁用的复选框?我认为用户不会理解这个“功能” :) - dieter
@TofferJ 我已经完成了相同的任务。 - Arbaz.in
@dieter 对于用户,我们可以显示 toast 或 alert dialog。 - Arbaz.in
2个回答

0

禁用的复选框无法接收事件。如果您将禁用的复选框放在像FrameLayout这样的布局上,当您单击布局时,可以接收事件,但不能在禁用的复选框上接收事件。如果您想捕获禁用的复选框上的事件,最好的方法是简单地模拟一个禁用的复选框,并捕获长按事件以重新激活。

我所做的是一个带有白色文本颜色但以灰色文本颜色和未选中状态开始的复选框,具有一个布尔型停止变量,在每个onCheckedChanged方法之前都要检查该变量。除非您更改布尔型停止变量,否则永远不会选中复选框。您可以多次按复选框,但不会发生任何事情。它只是看起来像被禁用了,但当您按下长按时,就会解除布尔型停止变量的阻止并将灰色文本颜色的复选框更改为白色,就像普通复选框一样。您可以随时更改停止变量并“再次禁用它”。

在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_width="wrap_content"
      android:layout_height="wrap_content"
      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;
   }
});

希望这能对你有所帮助。

0
通常在 Android 中,这种情况的行为是一个问号。你可以尝试的一件事是将 CheckBox 放置在从 ViewGroup 派生的某个东西上(例如众多布局之一的 FrameLayout),并在其上使用 setOnClickListener

2
这个功能运行得相当不错,但是Click事件只能从布局中生成。也就是说,如果我点击复选框,它仍然无法传播。是否有任何设置可以使整个布局可点击? - Filip Majernik

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