Android 复选框 setOnCheckedChangeListener 不起作用

Android Checkbox setOnCheckedChangeListener does not work

这应该是非常简单的事情,但由于某种原因,复选框的侦听器不起作用。

这是我的布局:

                <RelativeLayout
                android:layout_width="match_parent"
                android:layout_marginRight="16dp"
                android:layout_marginLeft="16dp"
                android:layout_height="wrap_content">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="12sp"
                    android:layout_marginLeft="@dimen/dimen_5"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentStart="true"
                    android:layout_centerVertical="true"
                    android:textStyle="bold"
                    android:text="@string/my_text"
                    />

                <CheckBox
                    android:id="@+id/check_status"
                    android:layout_width="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_alignParentEnd="true"
                    android:layout_height="wrap_content" />
            </RelativeLayout>

这是我片段中的实现:

CheckBox checkBox = mView.findViewById(R.id.check_status);
            checkBox.setOnCheckedChangeListener(new 
CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean 
isChecked) {
                    LOGD(TAG, "IsButton checked ? "+ isChecked);
                    Toast.makeText(getActivity(), "Check", 
Toast.LENGTH_SHORT).show();
                }
            });

就像我说的,这应该是非常简单的事情,但是听众.....好吧它什么也没听。我正在 Nexus 5x Oreo 和小型摩托罗拉棉花糖上进行测试。

有时我什至尝试了 setOnClickListener() 方法:

checkBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    LOGD(TAG, "IsButton checked ? "+ ((CheckBox) 
v).isChecked());
                }
            });

结果是一样的,我在 logcat

中没有看到任何东西

有人知道为什么 Checkbox 的侦听器无法正常工作吗?

很可能 setOnCheckedChangeListener() 没有被调用 :)

没有理由不工作。

  1. 在您的 xml 中,您必须根据您的要求至少定义检查类型。

    android:checked="false"

  2. 在 java 文件中你必须使用 setOnCheckedChangeListener().

希望它对所有人有用。

如果您使用 DataBinding,请设置属性 android:checked="@={viewModel.someState}",然后通过 ViewBinding 调用此侦听器,如

binding.checkBox.setOnCheckedChangeListener { _, _ ->
    //
}

setOnCheckedChangeListener不会被调用。

  1. 您可以设置app:checkListener并使用BindingAdapter:

    @BindingAdapter("app:checkListener")
    fun CheckBox.setCheckedChangeListener(listener: CompoundButton.OnCheckedChangeListener) {
        setOnCheckedChangeListener(listener)
    }
    
  2. 或观察someState的变化:

    viewModel.someState.observe(viewLifecycleOwner) {
        viewModel.changeCheckBox()
        // Other actions.
    }