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