レイアウトファイル上にIDが重複している場合の検索と、その有用性について【AndroidStudio】

 例えばカレンダーのように、1つの画面に同じ要素が複数存在する場合。



レイアウト(XML)ファイル上に42個、せこせこ書いていくのは流石にかっこ悪いので

要素を1つのXMLファイルにして、レイアウト上に挿入(include)してみるのは自然なことだと思います。

<include layout="@layout/content_calender_cell" />
<include layout="@layout/content_calender_cell" />
<include layout="@layout/content_calender_cell" />
<include layout="@layout/content_calender_cell" />
<include layout="@layout/content_calender_cell" />
<include layout="@layout/content_calender_cell" />


ちなみに、カレンダーであれば月が替われば配置された要素の日付表示は変えたいですし

他の場合も挿入した要素内の中身をプログラム上から変更したいことが多々発生します。

しかし、挿入した要素は同一のXMLファイルのため、表示されているTextViewは同じIDを保持しているため単純に[view.findViewById(日付テキスト)]を使ってもうまく取得できません。


何か方法がないかと調べてみると、XMLファイル上で挿入時にIDが指定できること、

更に、[view.findViewById(親要素).findViewById(日付テキスト)]てな感じで検索することができることがわかりました。

 参考:レイアウトを使いまわす - 他に定義したレイアウトを読み込ませる方法


つまり、レイアウトファイルの挿入時にIDを指定して

<include layout="@layout/content_calender_cell" android:id="@+id/cal_view_day_01" />
<include layout="@layout/content_calender_cell" android:id="@+id/cal_view_day_02" />
<include layout="@layout/content_calender_cell" android:id="@+id/cal_view_day_03" />
<include layout="@layout/content_calender_cell" android:id="@+id/cal_view_day_04" />
<include layout="@layout/content_calender_cell" android:id="@+id/cal_view_day_05" />
<include layout="@layout/content_calender_cell" android:id="@+id/cal_view_day_06" />

プログラム上で、

[view.findViewById(R.id.cal_view_day_01).findViewById(日付テキスト)]

[view.findViewById(R.id.cal_view_day_02).findViewById(日付テキスト)]のように取得すれば同一IDでも問題なく検索(取得)できました。


考えてみれば当たり前の機能なのかもしれませんがレイアウトを作成するうえで

画面内に同じ要素を配置することは多々ありますので、

極力きれいなコーディングをするための基礎知識としてしっかり覚えておきます。


以上、本日の記録。


コメント

このブログの人気の投稿

Activity上に配置されたToolbarをFragment上から変更し、イベントを拾う方法【AndroidStudio】

AlertDialogのボタンをカスタマイズする【AndroidStudio】