如何在Android复选框(checkbox)选中状态改变时接收事件?

63

当复选框被启用或禁用时,接收和发送事件的正确方法是什么?

在C#中,我只需双击即可完成所有代码。但在Android中,这似乎有点更加晦涩。我考虑使用触摸事件处理程序,但是如果用户有键盘,则不会检测到更改,因为它不是触摸。我想Android应该有一个本地事件来检测复选框状态的改变。


1
编写代码时自己输入代码而不是通过点击方式进行编码并不算是什么“晦涩难懂”的事情。 - The incredible Jan
4个回答

164
CheckBox repeatChkBx = ( CheckBox ) findViewById( R.id.repeat_checkbox );
repeatChkBx.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        if ( isChecked )
        {
            // perform logic
        }

    }
});

21
虽然这是正确的答案,但我想知道当复选框位于ListView项内并且每次用户滚动过它时都会调用onCheckedChange时,最佳方法是什么。有没有办法区分是由用户发起还是由ListView更新发起? - rmooney
2
@Rmooney的这条评论真是太棒了!我遇到了RecyclerView适配器的问题,每次滚动它都会疯狂地调用多次!谢谢! - jean d'arme
3
在适配器中,当你设置特定 holder 的 checkchange 时,需要先移除监听器,改变值,然后再重新添加监听器。复选框本身会强制调用监听器,因此你必须先移除它,才能设置值而不触发监听器。 - Tatarize

8

由于CheckBox(最终)扩展了View,因此您可以使用标准的OnClickListener来检测用户实际点击CheckBox的时间(而不是ListView更新):

CheckBox repeatChkBx = ( CheckBox ) findViewById( R.id.repeat_checkbox );
repeatChkBx.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        if ( ((CheckBox)v).isChecked() ) {
            // perform logic
        }
    }
});

如果用户决定拖动开关而不是单击它,则不会触发此操作。 - Silvia H
1
@Silvia H 一个复选框不是一个开关。你不能在复选框上拖动任何东西。 - The incredible Jan

5
在Kotlin中:
   checkBoxView.setOnCheckedChangeListener { _, isChecked ->
        print("checked: $isChecked")
    }

1

试一试

CheckBox checkbox=(CheckBox)findViewById(R.id.checkbox);
checkbox.setOnClickListener(new View.OnClickListener()
{
        @Override
        public void onClick(View v)
        {
            if (checkbox.isChecked())
            {
             //Perform action when you touch on checkbox and it change to selected state
            }
            else
            {
   //Perform action when you touch on checkbox and it change to unselected state
            }
        }
    });

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