ListViewの下にボタンを配置したい、ただし両者は重ならないように その2(改訂版)
※2012.07.07 改訂:LinearLayoutで囲む→LinearLayoutも不要
以前、ListViewの下に重ならないようにボタンを配置するエントリを書いた。これは、RelativeLayoutを使う方法だったが、最近はRelativeLayoutを使わない方法でやっているのでそれを書いてみる。
#その1はこちら→ http://d.hatena.ne.jp/windbell/20110815#p1
画面にいっぱいに ListView を配置し、画面下部には常にボタンがあるようなレイアウトを作りたい場合、以下のようなやり方がある。
- RelativeLayout の中に ListView と 下部に配置するボタン等を含む LinearLayout を配置
- ListView の layout_height は fill_parent にする
- LinearLayout の layout_height は wrap_content にし、layout_alignParentBottom="true" で常に下部に配置されるよう指定する
しかし、この方法だと、ListViewがまず画面いっぱいに配置され、その上に被さるように、ボタン等を含む LinearLayoutが配置される。
しかし、私は ListView と下部のボタンをどうしても重ねたくなかった。そこで、いろいろ試行錯誤していたら、以下のようにlayoutを記載することで、それが可能であることが判明した。
- ListViewを LinearLayoutで囲み、そこへ android:layout_weight="1" を定義する。
- ListViewに android:layout_weight="1" を定義する。
以下に実例を示す。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="0dp" android:layout_margin="5dp" android:background="#40FF0000" android:layout_weight="1" > </ListView> <LinearLayout android:id="@+id/linearLayout2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="攻め" android:layout_weight="1" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="判定せよ!" android:textSize="16sp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="受け" android:layout_weight="1" /> </LinearLayout> </LinearLayout>
実際の表示例は、以下となる。
※ボタンのキャプションおよびテキストは気にしないでください。
上記イメージは、実際の eclipse上でのプレビューのもの。青い枠は、選択状態の ListViewを示しているのだが、その領域が、下部の LinearLayoutの領域とかぶっていないことがわかると思う。
上記のポイントは、RelativeLayout を使わないことにある。
LinearLayoutの縦幅を layout_weight="1" で「余った領域の範囲内で引き延ばす」よう制限し、その中にListViewをくるむことで、ListViewの「勝手に縦幅余白無双」を防いでいる感じになっている。
ListViewの縦幅を layout_weight="1" で「余った領域の範囲内で引き延ばす」よう制限することで、ListViewの「勝手に縦幅余白無双」を防いでいる。
RelativeLayoutで同じこと(下のボタンとの重なりを防ぐ)をやる場合より、このやり方の方が幾分シンプルで、記載順序的な意味でもわかりやすい方法だと思う。
ちなみにこれは余談だが、私は RelativeLayout があまり好きではない。
それは以下の理由による。
・保守性が悪い
位置関係をid名で互いに定義し合うため、レイアウトに変更があった場合、改造箇所が増える。
今後レイアウトを変更しないのであれば別に RelativeLayout でも良いが、そういうケースはあまりない。バージョンアップの際などに、コントロールを追加したくなったり、追加せざるを得なくなったりするのは良くあることである。
そのため私はどうしても必要なとき以外、RelativeLayout は使わないようにしている。