ど素人から毛を生やす。<延>

AndroidにてXMLで作成したオブジェクトの連番IDをforで取得したい。

java > フロントエンジニア、javaを学ぶ 2016年10月20日(最終更新:11月前)

どもです。

授業で、電卓アプリを作ることになりました。
数値や演算ボタンはXMLの方で作成。これをfindViewByIdでボタン配列に紐づけする。

のは良いけど、数値ボタンなんてIDも連番だし、forで簡単に個数分宣言できないの?

と思った次第。
結論としてはできたのですが、ちょっと知らないと厄介なポイントがありました。

ソースは以下の通り。

通常(forを使わない)紐づけ方法↓

nums[1] = (Button)findViewById(R.id.XMLの方で宣言したID);

forを使った紐づけ方法↓

for(int i=0; i < nums.length; i++) {
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()を使用。
使い方は以下の通り。

getIdentifier("リソース名", "欲しい値", "パッケージ名");

リソース名はString型なので、forで動的に変更したstrを入力。
欲しい値はIDなので、"id"を入力。ここも渡す値はString型なのでクォーテーションが必須。
パッケージ名は同一パッケージ内での処理なのでgetPackageName()でおk。

留意しておくべき「R.id.」の正体

R.id.XmlIdは定数。
機械上で自動生成されたIDを僕たちが扱えるようにしたもので、実際はInt型の整数値。

getIdentifier()で取得できるのはInt型のID、
つまり、

getIdentifier("XmlId", "id", getPackageName()) = R.id.XmlId

ということ。

Androidプログラミングに慣れた方なら何を当然のことを、と思われるでしょうが、
毛の生えていない初心者的にはここは間違い頻発ポイントと思われます。僕がやりました。

×nums[i] = (Button)findViewById(R.id.buttonId);
○nums[i] = (Button)findViewById(buttonId);

デス!!

Androidは、初心者的にはブラックボックス気味なクラスが山ほど。
自分がいま扱っているデータはいったい何なのか。
きちんと確認、意識しておくべきだと痛感しました。( ;∀;)

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった  (0)
  • (`・ω・´) 役に立った (0)
  • (・∀・) 参考になった (1)