dimanche 16 juin 2019

Setting View.VISIBLE does not always make my views visible

I have the following list of checkboxes and 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>

The TextInputLayouts are shown and hidden based on if cirtan checkboxes are clicked or not. Here is the code that handles that:

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
                }
            }
        }
    }
}

The way this is supposed to work is that certain TextInputLayouts are displayed when the user selects certain checkboxes. For example: if the user selects the has_lession checkbox, it is supposed to display the lesionCommentsField TextInputLayout.

The first time the user goes through this form, this code worked perfectly. For all the checkboxes and TextInputLayouts. The second time the user is on this form, the checkboxes that were clicked the last time around don't make their corresponding TextInputLayouts visible. For example: if the user selects the has_lession checkbox last time they used the form and selects the same checkbox this time around the lesionCommentsField is not displayed.

The other checkboxes that were not clicked in the previous use of the form work just fine, it is only the checkboxes that were used in previous use of the form that misbehaves.

The issue goes away when the app is restarted.

I have debugged and checked that the fields do get set to visible, they are just not displayed on the screen.

I have this inside a fragment and the checkbox code is in its parent activity. Not sure if this makes a difference.

How would I go about debugging and resolving this?




Aucun commentaire:

Enregistrer un commentaire