设置 View.VISIBLE 并不总能让我的观点可见

Setting View.VISIBLE does not always make my views visible

我有以下复选框和 TextInputLayouts 列表

    <CheckBox
            android:text="@string/has_lession"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/hasLeassionCheckBox"
            android:layout_marginTop="16dp" app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="32dp"
            app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="32dp"
            app:layout_constraintHorizontal_bias="1.0"
            android:onClick="onCheckboxClicked"/>
    <com.google.android.material.textfield.TextInputLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="32dp"
            app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="32dp"
            android:hint="@string/lesion_comments" app:layout_constraintHorizontal_bias="0.0"
            android:layout_marginTop="16dp" app:layout_constraintTop_toBottomOf="@+id/hasHadLessionCheckBox"
            android:visibility="gone" android:id="@+id/lesionCommentsField">

        <com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:singleLine="false"/>
    </com.google.android.material.textfield.TextInputLayout>
    <CheckBox
            android:text="@string/has_had_lession"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/hasHadLessionCheckBox" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="32dp" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="32dp" android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@+id/hasLeassionCheckBox"
            android:onClick="onCheckboxClicked"/>
    <CheckBox
            android:text="@string/uses_tobaco"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/tobacoCheckBox" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="32dp" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="32dp" android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@+id/lesionCommentsField"
            android:onClick="onCheckboxClicked"/>
    <com.google.android.material.textfield.TextInputLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="32dp"
            android:layout_marginEnd="32dp" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginTop="16dp"
            android:hint="@string/years_of_tobacco_use"
            app:layout_constraintTop_toBottomOf="@+id/tobacoCheckBox" android:id="@+id/yearsOfTobacoUseField"
            android:visibility="gone">

        <com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:singleLine="true"
                android:inputType="number"/>
    </com.google.android.material.textfield.TextInputLayout>
    <CheckBox
            android:text="@string/uses_alcohol"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/alcoholCheckbox" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="32dp" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="32dp" android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@+id/yearsOfTobacoUseField"
            android:onClick="onCheckboxClicked"/>
    <com.google.android.material.textfield.TextInputLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/alcoholYearsField" app:layout_constraintStart_toEndOf="@+id/drinksPerWeek"
            app:layout_constraintHorizontal_bias="0.5" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="32dp" android:layout_marginStart="8dp"
            app:layout_constraintTop_toTopOf="@+id/drinksPerWeek"
            app:layout_constraintBottom_toBottomOf="@+id/drinksPerWeek" android:hint="@string/years_alcohol_used"
            android:visibility="gone">

        <com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="number"/>
    </com.google.android.material.textfield.TextInputLayout>
    <com.google.android.material.textfield.TextInputLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/drinksPerWeek" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.5" app:layout_constraintEnd_toStartOf="@+id/alcoholYearsField"
            android:layout_marginStart="32dp" android:layout_marginEnd="8dp" android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@+id/alcoholCheckbox" android:hint="@string/drinks_per_week"
            android:visibility="gone">

        <com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:singleLine="true"
                android:inputType="number"/>
    </com.google.android.material.textfield.TextInputLayout>
    <CheckBox
            android:text="@string/history_of_cancer"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/cancerCheckBox" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="32dp" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="32dp" android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@+id/drinksPerWeek"
            android:onClick="onCheckboxClicked"/>
    <com.google.android.material.textfield.TextInputLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/cancerCountField" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.5" app:layout_constraintEnd_toStartOf="@+id/cancerYearsField"
            app:layout_constraintTop_toTopOf="@+id/cancerYearsField"
            app:layout_constraintBottom_toBottomOf="@+id/cancerYearsField" android:layout_marginStart="32dp"
            android:layout_marginEnd="8dp" android:visibility="gone"
            android:hint="@string/cancer_count">

        <com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="number"/>
    </com.google.android.material.textfield.TextInputLayout>
    <com.google.android.material.textfield.TextInputLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/cancerYearsField"
            app:layout_constraintStart_toEndOf="@+id/cancerCountField" app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@+id/cancerCheckBox" android:layout_marginStart="8dp"
            android:layout_marginEnd="32dp" android:visibility="gone"
            android:hint="@string/years_since_cancer">

        <com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="number"/>
    </com.google.android.material.textfield.TextInputLayout>
    <CheckBox
            android:text="@string/history_of_oral_pain"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/oralPainCheckBox" android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@+id/cancerCountField"
            app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="32dp"
            app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="32dp"
            android:onClick="onCheckboxClicked"/>
    <com.google.android.material.textfield.TextInputLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/painSeverityField" android:hint="@string/pain_severity"
            app:layout_constraintStart_toEndOf="@+id/yearsOfOralPainField"
            app:layout_constraintHorizontal_bias="0.5" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginTop="16dp" app:layout_constraintTop_toBottomOf="@+id/oralPainCheckBox"
            android:layout_marginStart="8dp" android:layout_marginEnd="32dp" android:visibility="gone">

        <com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="number"/>
    </com.google.android.material.textfield.TextInputLayout>
    <com.google.android.material.textfield.TextInputLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/yearsOfOralPainField"
            android:hint="@string/years_of_oral_pain" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.5" app:layout_constraintEnd_toStartOf="@+id/painSeverityField"
            app:layout_constraintTop_toTopOf="@+id/painSeverityField"
            app:layout_constraintBottom_toBottomOf="@+id/painSeverityField" android:layout_marginStart="32dp"
            android:layout_marginEnd="8dp" android:visibility="gone">

        <com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="number"
        />
    </com.google.android.material.textfield.TextInputLayout>
    <com.google.android.material.button.MaterialButton
            android:text="@string/next"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/nextPatientButton" android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@+id/painSeverityField" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="32dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

TextInputLayout 的显示和隐藏基于是否单击了 cirtan 复选框。这是处理该问题的代码:

fun onCheckboxClicked(view: View) {
    if (view is CheckBox) {
        val checked: Boolean = view.isChecked
        val test = view.id
        when (view.id) {
            R.id.hasLeassionCheckBox->{
                if(checked){
                    lesionCommentsField.visibility = View.VISIBLE
                }
                else{
                    lesionCommentsField.visibility = View.GONE
                }
            }
            R.id.tobacoCheckBox->{
                if(checked){
                    yearsOfTobacoUseField.visibility = View.VISIBLE
                }
                else{
                    yearsOfTobacoUseField.visibility = View.GONE
                }
            }
            R.id.alcoholCheckbox->{
                if(checked){
                    drinksPerWeek.visibility = View.VISIBLE
                    alcoholYearsField.visibility = View.VISIBLE
                    Log.i("PATIENT ACTIVITY", "DRINKS PER WEEK VIEW: ${drinksPerWeek.visibility}")
                }
                else{
                    drinksPerWeek.visibility = View.GONE
                    alcoholYearsField.visibility = View.GONE
                }
            }
            R.id.cancerCheckBox-> {
                if (checked) {
                    cancerYearsField.visibility = View.VISIBLE
                    cancerCountField.visibility = View.VISIBLE
                } else {
                    cancerYearsField.visibility = View.GONE
                    cancerCountField.visibility = View.GONE
                }
            }
            R.id.oralPainCheckBox->{
                if(checked){
                    yearsOfOralPainField.visibility = View.VISIBLE
                    painSeverityField.visibility = View.VISIBLE
                }
                else{
                    yearsOfOralPainField.visibility = View.GONE
                    painSeverityField.visibility = View.GONE
                }
            }
        }
    }
}

这应该工作的方式是当用户选择某些复选框时显示某些 TextInputLayouts。例如:如果用户选择 has_lession 复选框,则应该显示 lesionCommentsField TextInputLayout。

用户第一次填写此表单时,此代码运行良好。对于所有复选框和 TextInputLayouts。用户第二次使用此表单时,上次单击的复选框不会使其相应的 TextInputLayouts 可见。例如:如果用户在上次使用表单时选择了 has_lession 复选框,而这次在 lesionCommentsField 周围选择了相同的复选框。

之前使用表单时未点击的其他复选框工作正常,只有之前使用表单时使用的复选框出现问题。

重启应用程序后问题消失。

我已经调试并检查了这些字段是否设置为可见,只是它们没有显示在屏幕上。

我在一个片段中有这个,复选框代码在它的父 activity 中。不确定这是否有所作为。

我将如何调试和解决这个问题?

编辑我的答案,我刚刚了解到可以同时看到多个视图。

为什么不为所有复选框单独编写此 onCheckChange 方法而不是 onClick?

hasLeassionCheckBox.setOnCheckedChangeListener { compoundButton, isChecked ->
            if (isChecked) {
                lesionCommentsField.visibility = View.VISIBLE
            } else {
                lesionCommentsField.visibility = View.GONE
            }
        }