どもです。
授業で、電卓アプリを作ることになりました。
数値や演算ボタンはXMLの方で作成。これをfindViewByIdでボタン配列に紐づけする。
のは良いけど、数値ボタンなんてIDも連番だし、forで簡単に個数分宣言できないの?
と思った次第。
結論としてはできたのですが、ちょっと知らないと厄介なポイントがありました。
ソースは以下の通り。
通常(forを使わない)紐づけ方法↓
forを使った紐づけ方法↓
String str = "XMLで宣言したIDの連番部分を除いたもの" + i;
int buttonId = res.getIdentifier(str, "id", getPackageName());
nums[i] = (Button)findViewById(buttonId);
}
(Button)findViewById(R.id.XMLで宣言したID+i)でイケるかなって思ってしまうのですが、
問題はこの(R.id.XmlId)という奴がString型でなくてInt型だというところ。
デバックかけてみるとわかるのですが、これ定数扱いなんですね。処理上では整数値に変換される。
ということで、リソースの情報を取得するgetIdentifier()を使用。
使い方は以下の通り。
リソース名はString型なので、forで動的に変更したstrを入力。
欲しい値はIDなので、"id"を入力。ここも渡す値はString型なのでクォーテーションが必須。
パッケージ名は同一パッケージ内での処理なのでgetPackageName()でおk。
留意しておくべき「R.id.」の正体
R.id.XmlIdは定数。
機械上で自動生成されたIDを僕たちが扱えるようにしたもので、実際はInt型の整数値。
getIdentifier()で取得できるのはInt型のID、
つまり、
ということ。
Androidプログラミングに慣れた方なら何を当然のことを、と思われるでしょうが、
毛の生えていない初心者的にはここは間違い頻発ポイントと思われます。僕がやりました。
×nums[i] = (Button)findViewById(R.id.buttonId);
○nums[i] = (Button)findViewById(buttonId);
デス!!
Androidは、初心者的にはブラックボックス気味なクラスが山ほど。
自分がいま扱っているデータはいったい何なのか。
きちんと確認、意識しておくべきだと痛感しました。( ;∀;)