如何在android复选框上接收事件检查更改?

Ann*_*ajb 50 checkbox events android

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

在C#中,我可以轻松地双击,所有代码都将为我完成.但在android中它看起来有点模糊.我想过使用触摸事件处理程序,但如果用户有键盘,它将无法检测到更改,因为它没有触摸.我认为android应该有一个原生事件,用于复选框状态更改.

Cri*_*ian 146

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

    }
});
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是正确的答案,但我很好奇当复选框位于ListView项目中时,最好的方法是什么,每次用户滚过它时都会调用onCheckedChange.有什么方法可以区分用户和listview更新发起的时间吗? (21认同)
  • 在适配器中,为该特定持有者设置checkchange时.首先删除监听器,更改值,然后读取监听器.复选框本身强制调用侦听器,因此您必须将其删除以设置值而不触发它. (3认同)
  • ^ @ Rmooney的评论是金子!我在使用RecyclerView适配器时遇到了问题,每次滚动时,它都会疯狂地多次调用!谢谢! (2认同)

Phi*_*o99 7

由于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
        }
    }
});
Run Code Online (Sandbox Code Playgroud)


Spe*_*eed 5

在科特林中:

   checkBoxView.setOnCheckedChangeListener { _, isChecked ->
        print("checked: $isChecked")
    }
Run Code Online (Sandbox Code Playgroud)