web-dev-qa-db-ja.com

Android Kotlin findViewByIdをnullにすることはできません

Javaプロジェクトで使用するカスタムアラートダイアログをKotlinに変換して作成しました。Java.lang.IllegalStateExceptionの下に投稿されたエラー:findViewById(R.id.btnYES)はnullにできません

エラーの原因が回避できません!私たちはいくつかの投稿を見て、いくつかの結果を出さずに試しました。アクティビティ構造は次のとおりです。Pag​​eTwoActivityには、2つのボタンがアタッチされた独自のXMLファイルがあります。カスタムダイアログには独自のxmlファイルがあります。Pag​​eTwoActivityコードは次のとおりです。 PageTwoActivityの2つのボタンがない場合、名前は競合しません

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

カスタムダイアログのコードは次のとおりです

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

カスタムダイアログのXMLファイルコード

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

だから問題はどのようにエラーを修正するのですか?カスタムダイアログXMLを膨らませる必要がありますか?ご覧のとおり、宣言を移動してidをdoCustom関数に挿入しようとしました// val btnYES = view !!。findViewById(R.id.btnYES)このリンクはアドバイスを提供しますが、どこから始めればよいかわかりません [〜#〜]リンク[〜#〜]

5
Vector

使用できる1つのアプローチは、setContentViewを使用してダイアログをカスタマイズする代わりに、新しいカスタムダイアログフラグメントでDialogFragmentを拡張することです。その後、フラグメントと同じようにアプローチできます。あなたはonCreateDialogでビューを膨らませます、これは私が同様の質問で見つけたアプローチです:

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