2013年2月9日土曜日

Android備忘録:リソースR


Androidアプリ開発を初めて間もない頃、
「layoutに配置したButtonなどのidは、R.id.****で指定だ!」
と、何も考えずに覚えていました。

そんなままで開発を進めていくと、
ある日Buttonを取得しても、findViewByIdの戻り値が
null になる日が来ました。
その後、当然のごとく NullPointerException が来ます。

 えぇ!?ちゃんと Button btn = (Button)findViewById(R.id.button_hoge);
 と記述しているのになぜ??

…はい。見ているレイアウトファイルが違うからですね。
ActivityをextendsしているクラスのonCreateの中で、
例えば setContentView(R.layout.main); としているとします。

その後、main.xml ではない別のレイアウトファイルを
扱い、その中のButtonを使う場合には、ちゃんと別のレイアウトを指定して
findViewById しないといけません。以下、例です。

1
2
3
final LayoutInflater layout = LayoutInflater.from(this);
final View view = layout.inflate(R.layout.sub, null);
final Button btn = (Button) view.findViewById(R.id.button_hoge);

これで問題なく動作するはずです。
やはりちゃんと理解しないとダメですね。

0 件のコメント:

コメントを投稿