android MaterialButtonToggleGroup addOnButtonCheckedListener每次调用两次

2uluyalo  于 2023-06-20  发布在  Android
关注(0)|答案(1)|浏览(118)

由于一些奇怪的原因,每次单击MaterialButtonToggleGroup中的任何按钮时,addOnButtonCheckedListener都会被调用两次。下面是我的XML

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp"
    tools:context=".ui.UserCartCheckout">
    <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:padding="5dp">
        <com.google.android.material.button.MaterialButtonToggleGroup
            android:id="@+id/btgTest"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:checkedButton="@id/btnTest1"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:singleSelection="true"
            app:selectionRequired="true">
            <com.google.android.material.button.MaterialButton
                android:id="@+id/btnTest1"
                style="?attr/materialButtonOutlinedStyle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/Cash"
                app:icon="@drawable/cash"
                app:iconGravity="textStart"
                android:enabled="true" />
            <com.google.android.material.button.MaterialButton
                android:id="@+id/btnTest2"
                style="?attr/materialButtonOutlinedStyle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/Pay_With_Stripe"
                app:icon="@drawable/contactless_payment"
                app:iconGravity="textStart"
                android:enabled="true" />
        </com.google.android.material.button.MaterialButtonToggleGroup>
    </androidx.appcompat.widget.LinearLayoutCompat>
</ScrollView>

下面是代码

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.btgTest.addOnButtonCheckedListener { group, checkedId, isChecked ->
            Timber.d("imini 177 isChecked: $isChecked")
            if (isChecked) {
                when (checkedId){
                    R.id.btnTest1 -> Timber.d("1 is checked")
                    R.id.btnTest2 -> Timber.d("2 is checked")
                }
            }else{
                Timber.d("imini 184")
            }
        }
    }

每次我点击顶部按钮btnTest1我的logcat将输出

imini 177 isChecked: true
1 is checked
imini 177 isChecked: false
imini 184

每次我点击底部的按钮btnTest2我的logcat将输出

imini 177 isChecked: false
imini 184
imini 177 isChecked: true
2 is checked

因此,正如您所看到的,不仅addOnButtonCheckedListener在每次单击其中的任何按钮时调用两次,而且当我单击顶部按钮时,它总是会被标记为not checked。为什么?

2ul0zpep

2ul0zpep1#

当您使用分组切换构件时,回调实现是正确的,因为:
1.当选中/取消选中任何项时,将触发回调
1.这是因为这是一个单一的选择切换组
1.当您选择Stripe时,Cash项将被取消选中,这将触发另一个回调调用,并使用更新后的值isChecked
如果您只想查看选中的项目,请执行以下操作:

materialToggleGroup.addOnButtonCheckedListener { _, checkedId, isChecked ->
    // not observing the unchecked value
    if (!isChecked) return@addOnButtonCheckedListener

    when (checkedId) {
        R.id.btnTest1 -> log("1 is checked")
        R.id.btnTest2 -> log("1 is checked")
    }
}

相关问题