web-dev-qa-db-fra.com

Android Kotlin findViewById ne doit pas être nul

Nous avons créé une boîte de dialogue d'alerte personnalisée qui a été utilisée dans un projet Java en le convertissant en Kotlin. L'erreur publiée sous Java.lang.IllegalStateException: findViewById (R.id.btnYES) ne doit pas être nulle

La source d'erreur nous échappe! Nous avons examiné un certain nombre de messages et en avons essayé quelques-uns sans résultat. La structure d'activité est la suivante. PageTwoActivity a son propre fichier XML avec deux boutons attachés. La boîte de dialogue personnalisée a son propre fichier xml Voici le code PageTwoActivity. Sans les deux boutons pour PageTwoActivity AUCUN conflit de nom

import Android.app.Dialog
import Android.content.Intent
import Android.support.v7.app.AppCompatActivity
import Android.os.Bundle
import Android.view.View
import Android.widget.Button
import Android.widget.EditText
import Android.widget.Toast

class PageTwoActivity : AppCompatActivity() {
internal lateinit var btnBACK: Button
internal lateinit var btnDIALOG: Button

internal lateinit var btnYES: Button
internal lateinit var btnNO: Button
internal lateinit var etStudentName:EditText
var EnteredText: String = ""

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_page_two)

    btnBACK = findViewById(R.id.btnBACK)
    btnDIALOG = findViewById(R.id.btnDIALOG)

    btnYES = findViewById(R.id.btnYES)
    btnNO = findViewById(R.id.btnNO)
    etStudentName = findViewById(R.id.etStudentName)
    addListenerOnButtonBACK()
    addListenerOnButtonDIALOG()

    Toast.makeText(this@PageTwoActivity, "You are on Page Two", 
    Toast.LENGTH_LONG).show()

}// END onCreate

Voici le code de la boîte de dialogue personnalisée

    private fun doCustom() {

    val openDialog = Dialog(this)
    openDialog.setContentView(R.layout.custom_dialog)
    //val btnYES = view!!.findViewById<Button>(R.id.btnYES)
    //val btnNO = openDialog.findViewById(R.id.btnNO)
    //val etStudentName = openDialog.findViewById(R.id.etStudentName)
    openDialog.setCancelable(false)


    btnYES.setOnClickListener(View.OnClickListener {
        EnteredText = etStudentName.getText().toString().trim({ it <= ' ' })
        if (EnteredText.isEmpty()) {
            Toast.makeText(applicationContext, "Enter Your Name\n\n OR Click 
     DECLINE", Toast.LENGTH_LONG).show()
            return@OnClickListener
        }
        Toast.makeText(applicationContext, "Registered $EnteredText", 
        Toast.LENGTH_SHORT).show()
        openDialog.dismiss()
    })

    btnNO.setOnClickListener(View.OnClickListener {
        EnteredText = ""
        val intent = Intent(this@PageTwoActivity, MainActivity::class.Java)
        startActivity(intent)
        openDialog.dismiss()
    })
    openDialog.show()
}

Le code de fichier XML pour la boîte de dialogue personnalisée

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="400dp"
Android:layout_height="200dp"
Android:background="@color/color_lightGray">

<TextView
    Android:id="@+id/tvDAT"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginLeft="70dp"
    Android:layout_marginTop="30dp"
    Android:text="Enter First and Last Name"
    Android:textColor="@color/color_Black"
    Android:textSize="22sp"
    Android:textStyle="bold" />

<EditText
    Android:id="@+id/etStudentName"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginLeft="20dp"
    Android:layout_marginTop="80dp"
    Android:ems="14"
    Android:gravity="center"
    Android:inputType="textPersonName"
    Android:text=""
    Android:textColor="@color/color_Black"
    Android:textSize="20sp"
    Android:textStyle="bold" />

<Button
    Android:id="@+id/btnYES"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginLeft="250dp"
    Android:layout_marginTop="120dp"
    Android:background="@color/color_Transparent"
    Android:text="TAKE QUIZ"
    Android:textColor="@color/color_deepBlue"
    Android:textSize="22sp"
    Android:textStyle="bold" />

<Button
    Android:id="@+id/btnNO"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginLeft="22dp"
    Android:layout_marginTop="120dp"
    Android:background="@color/color_Transparent"
    Android:text="DECLINE"
    Android:textColor="@color/color_deepBlue"
    Android:textSize="22sp"
    Android:textStyle="bold" />

   </RelativeLayout>

La question est donc de savoir comment corriger l'erreur? Faut-il gonfler le dialogue personnalisé xml? Comme vous pouvez le voir, nous avons essayé de déplacer la déclaration pour trouver l'id dans la fonction doCustom // val btnYES = view !!. FindViewById (R.id.btnYES) ce lien offre des conseils mais nous ne savons pas par où commencer LIEN

5
Vector

Au lieu d'essayer de personnaliser la boîte de dialogue à l'aide de setContentView, vous pouvez étendre DialogFragment avec un nouveau fragment de boîte de dialogue personnalisé. Ensuite, vous pouvez l'approcher de la même manière que vous le feriez pour un fragment; Vous gonflez une vue dans onCreateDialog, c'est une approche que j'ai trouvée dans une question similaire:

public class PopupAlert extends DialogFragment {
    TextView heading;
    TextView popupMessage;
    Button okBtn;

    private Runnable onDismissRunnable;
    private String titleText;
    private String messageText;

    private View.OnClickListener positiveListener;

    public void setOnDismissRunnable(Runnable runnable) {
        this.onDismissRunnable = runnable;
    }

    public void setOkBtnText(String text) {
        this.okBtnText = text;
    }

    public static PopupAlert newInstance(String title, String message) {
        PopupAlert alert = new PopupAlert();
        alert.titleText = title;
        alert.messageText = message;
        return alert;
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        if (onDismissRunnable != null) onDismissRunnable.run();
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        @SuppressLint("InflateParams") View view = LayoutInflater.from(getContext()).inflate(R.layout.view_popup_alert, null);
        fetchViews(view);
        builder.setView(view);

        return builder.create();
    }

    private void fetchViews(View view) {
        heading = view.findViewById(R.id.popupHeading);
        popupMessage = view.findViewById(R.id.popupMessage);
        okBtn = view.findViewById(R.id.okBtn);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        bindToData();
    }

    private void bindToData() {
        heading.setText(titleText);
        popupMessage.setText(messageText);
        okBtn.setOnClickListener((v) -> dismiss());
        okBtn.setText(okBtnText);
    }
}
0
Corey Johnson