Настройка View.VISIBLE не всегда делает мои представления видимыми - PullRequest
0 голосов
/ 16 июня 2019

У меня есть следующий список флажков и 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>

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 Ответ

1 голос
/ 16 июня 2019

Редактируя мой ответ, я только что понял, что несколько представлений могут быть видны одновременно.

Почему вы не пишете это отдельно для всех методов флажка onCheckChange вместо onClick?

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