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 は使わないようにしている。