Androidのアプリ開発関連のブログ

TableLayoutにborderと、LayoutInflater

今作ってるAndroidアプリで表を使いたいのでTableLayoutを使っているのだが、
TableLayoutにはborderをつけるような機能はないのね。めんどい。

HTMLの<table>でもフラットな線を引きたい場合や枠染色を指定したい場合によく使う方法だが、TableLayoutにborderを付けたい場合は、
TableLayout自体に枠線色となる色で背景色を指定し、各セルとなるViewの背景色を通常の背景色に指定して枠線幅分のmarginをつける。
という感じになる。


TableLayoutにborderをつけるにはそんな感じなのだが、今回の場合は表は動的に作るのでLayoutInflaterを多用している。
XMLで表をすべて作る場合は問題ないのだが、LayoutInflaterを使う場合、
inflate(int resource, ViewGroup root)
を使って第2引数をnullにする場合が多いと思うのだが、
第2引数のViewGroupは親要素なので、これがnullだとXMLにレイアウトパラメータが指定してあっても親要素依存の項目は無効化されてしまう。
第2引数で親要素を指定した場合は親要素依存のレイアウトパラメータも有効。

LayoutInflater.inflate()には、
inflate(int resource, ViewGroup root, boolean attachToRoot)
3引数タイプのものもあるが、2引数タイプのもので親要素を指定した場合はattachToRootがtrueの場合と同じ模様。
ここのattachToRootなのだが、trueにするとViewはinflate()で作成された時点で第2引数の親要素にaddView()された感じになるのでtrueだと便利。
なのだが、どうもinflate()で戻ってくるViewは、ここでattachToRootがtrueで挿入された場合は作成された子Viewではなく親要素が返ってくるみたい。
なので、挿入する子要素に対して処理を行いたい場合はattachToRootをfalseにして戻り値の子要素を取得してから別途addView()をした方が良さそう。