AlertDialog with custom layout, but findViewById for the inflated layout keeps getting null

31 Views Asked by At

I've inflated my custom dialog into a variable called dialogView then using dialogView I tried to get the MaterialTextView, MaterialButton that is a child view to this, but it keep returning null to me.

Custom dialog view

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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="match_parent">
<androidx.constraintlayout.widget.Guideline
    android:id="@+id/gl10"
    android:layout_width="1dp"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.10" />

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/gl90"
    android:layout_width="1dp"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.90" />

<com.google.android.material.textview.MaterialTextView
    android:id="@+id/tvHeader1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Error"
    app:layout_constraintHorizontal_bias="0"
    app:layout_constraintStart_toEndOf="@+id/gl10"
    app:layout_constraintEnd_toStartOf="@+id/gl90"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:textStyle="bold" />

<com.google.android.material.textview.MaterialTextView
    android:id="@+id/tvDescription1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    tools:text="Error Description"
    app:layout_constraintStart_toEndOf="@+id/gl10"
    app:layout_constraintEnd_toStartOf="@+id/gl90"
    app:layout_constraintTop_toBottomOf="@+id/tvHeader1"
    android:layout_marginStart="8dp"
    android:layout_marginTop="16dp" />

<com.google.android.material.button.MaterialButton
    android:id="@+id/btnNegative1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Cancel"
    app:layout_constraintStart_toEndOf="@+id/gl10"
    app:layout_constraintEnd_toStartOf="@+id/btnPositive1"
    app:layout_constraintTop_toBottomOf="@+id/tvDescription1"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintVertical_bias="0"/>

<com.google.android.material.button.MaterialButton
    android:id="@+id/btnNeutral1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Neutral"
    app:layout_constraintStart_toEndOf="@+id/gl10"
    app:layout_constraintEnd_toStartOf="@+id/gl90"
    app:layout_constraintTop_toBottomOf="@+id/btnNegative1"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintVertical_bias="0" />

<com.google.android.material.button.MaterialButton
    android:id="@+id/btnPositive1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="OK"
    app:layout_constraintStart_toEndOf="@+id/btnNegative1"
    app:layout_constraintEnd_toStartOf="@+id/gl90"
    app:layout_constraintTop_toBottomOf="@+id/tvDescription1"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintVertical_bias="0" />
</androidx.constraintlayout.widget.ConstraintLayout>

Inside my class which extends DialogFragment

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialogBuilder = AlertDialog.Builder(activity)
    val dialogView = layoutInflater.inflate(R.layout.custom_dialog, null)
    dialogBuilder.setView(dialogView)
    dialogView.findViewById<MaterialTextView>(R.id.tvHeader1).text = title
    dialogView.findViewById<MaterialTextView>(R.id.tvDescription1).text = message
    if (positiveText != null && positiveListener != null) {
        val btnPositive = dialogView.findViewById<MaterialButton>(R.id.btnPositive1)
        btnPositive.text = positiveText
        btnPositive.setOnClickListener { v ->
            positiveListener.onClick(v)
        }
    }
    if (negativeText != null && negativeListener != null) {
        val btnNegative = dialogView.findViewById<MaterialButton>(R.id.btnNegative1)
        btnNegative.text = negativeText
        btnNegative.setOnClickListener { v ->
            negativeListener.onClick(v)
        }
    }
    if(neutralText != null && neutralListener != null) {
        val btnNeutral = dialogView.findViewById<MaterialButton>(R.id.btnNeutral1)
        btnNeutral.text = negativeText
        btnNeutral.setOnClickListener { v ->
            neutralListener.onClick(v)
        }
    }
    dialogBuilder.setCancelable(cancelable)

    val dialog = dialogBuilder.create()
    dialog.setCanceledOnTouchOutside(cancelable)
    return dialog
 }

My dialogView.findViewById<MaterialTextView>(R.id.tvHeader1) code keeps getting null thus making the app crash at this line when trying to update the text of null object.

Stuck for hours on this, been searching and trying but don't seems to get it why it is not working.

0

There are 0 best solutions below