设置View.VISIBLE并不总是使我的视图可见

时间:2019-06-16 14:35:38

标签: android checkbox android-view android-textinputlayout

我有以下复选框和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>

根据是否单击cirtan复选框来显示和隐藏TextInputLayouts。这是处理该问题的代码:

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周围选择相同的复选框。

在先前使用该表单时未单击的其他复选框也可以正常工作,只有先前在使用该表单时使用的复选框行为异常。

重新启动应用程序后,问题消失了。

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

我将其包含在一个片段中,并且复选框代码位于其父活动中。不知道这是否有所作为。

我该如何进行调试和解决?

1 个答案:

答案 0 :(得分:1)

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

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

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