ViewをカスタマイズしたAlertDialogにfindViewByIdするとNullPointerExceptionが起きる

AlertDialogViewをカスタマイズしてEditTextを追加。そして、OKボタンが押されたときに、そこに入力されたデータにfindViewByIdを使ってアクセスしようとするとNullPointerExceptionが発生した。

AlertDialogでOKが押されたときの処理

エラーは以下。

java.lang.NullPointerException: Attempt to invoke virtual method ‘android.text.Editable android.widget.EditText.getText()’ on a null object reference

どうやらEditTextが取れていない。

これは、mixiさんの課題で引っかかった問題。MainActivityAssignmentDialogFragmentというインナークラスを作ってアラートダイアログを実装していた。その中の、onCreateDialogメソッド内でこんな感じで書いていた。

https://gist.github.com/daipresents/8ab63dc0173c36520ca54c7bbbec5855.js?file=MainActivity.java

builder.setView(R.layout.dialog);でカスタムレイアウトを設定している。そして、EditText editText = (EditText) getActivity().findViewById(R.id.yourName);でダイアログに表示されるEditTextの値を取ろうとしているが、nullが返ってきている。調べてみると、書き方がまずいらしい。以下のように直したら動いた。

https://gist.github.com/daipresents/8ab63dc0173c36520ca54c7bbbec5855.js?file=gistfile1.txt

まず、カスタムレイアウトをLayoutInflaterを使って取得。DialogInterface.OnClickListener()の中で使いたいのでメンバ変数に保管。

LayoutInflater inflater = (LayoutInflater)getActivity().getSystemService(LAYOUT_INFLATER_SERVICE);
this.layout = inflater.inflate(R.layout.dialog, (ViewGroup) getActivity().findViewById(R.id.dialog_layout));

そして、builder.setView(layout);で取得したレイアウトを設定。EditText editText = (EditText) layout.findViewById(R.id.yourName);でそれにアクセス。

なぜこうしないととれないのかがよくわからない。

参考: アラートダイアログ(AlertDialog)のカスタマイズ

広告