Met4licのあけくれ帖

日常とか、勉強したこととかいろいろ書いていくつもりのブログです

Androidでのつまづき02「TextViewがNullPointerExceptionで落ちる」

今回はまたまた最初のほうで躓いたので、メモ。
ダイアログを使ってユーザの入力したTextを表示しよう、と思い立ち
実際に書いているとあれ??となった。

    LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
    /**
    *dialoglayout = Dialog用のxmlファイル
    *containerはTextView「user_input」を含むLayout
    *inputStrはユーザの入力した文字列が入っている。
    */
    View view = inflater,inflate(R.layout.dialoglayout,
        (LinearLayout)findViewById(R.id.container));
    TextView tv = (TextView)findViewById(R.id.user_input);
    tv.setText(inputStr);
    /*省略*/

と書くとtv.setText()で落ちる。ログを見るとjava.lang.NullPointerException。
ぬぬぬ、インスタンス化してあるし大丈夫なはずじゃ…と思っていました。

findViewById()はきちんとどのViewから探すかを指定する

今回問題だったのが以下の部分。

    TextView tv = (TextView)findViewById(R.id.user_input);

ここがuser_inputというIDを見つけられないために、Nullで落ちていた模様。
デフォルトで書いてしまうと、おそらく今現在参照しているxml(今回はMainActivity)
の中から探そうとしてしまうらしい(当然っちゃ当然だし少し考えればわかるかも)。
したがって、正しいコードは以下

    TextView (TextView)view.findViewById(R.id.user_input);

viewは直前でinflateしているものなので、ここを指定してあげると、
きちんとこの中から該当のTextViewを探し出してきてくれる。

終わります。