ListViewの下にボタンを配置したい、ただし両者は重ならないように


※その2もあります→http://d.hatena.ne.jp/windbell/20120701#p1


また嵌ったのでメモ。


画面にいっぱいに ListView を配置し、画面下部には常にボタンがあるようなレイアウトを作りたい場合、以下のようなやり方がある。

  • RelativeLayout の中に ListView と 下部に配置するボタン等を含む LinearLayout を配置
  • ListView の layout_height は fill_parent にする
  • LinearLayout の layout_height は wrap_content にし、layout_alignParentBottom="true" で常に下部に配置されるよう指定する

しかし、この方法だと、ListViewがまず画面いっぱいに配置され、その上に被さるように、ボタン等を含む LinearLayoutが配置される。


しかし、私は ListView と下部のボタンをどうしても重ねたくなかった。そこで、いろいろ試行錯誤していたら、以下のようにlayoutを記載することで、それが可能であることが判明した。

  • RelativeLayout の中に ListView と 下部に配置するボタン等を含む LinearLayout を配置。ただし、先に LinearLayout の方を記載する
  • LinearLayout の layout_height は wrap_content にし、layout_alignParentBottom="true" で常に下部に配置されるよう指定する
  • ListView の layout_height は 0dip とし(高さを明記しない)、layout_weight を 1にする(余った領域をListViewのエリアとする)。layout_alignParentTop="true" を設定し、画面上部に配置されるようにする。さらに 先に記述した LinearLayout の上部に配置するための layout_above を設定する

以下に実例を示す。

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/tab_list"
    android:orientation="vertical"
    >
    
    <!-- 最初に下部に置きたいボタンを含むレイアウトを配置 -->
    
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/bottom_control"
        android:layout_alignParentBottom="true"
        >
        <Button
            android:id="@+id/button_left"
            android:text="攻め" 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center_vertical|center_horizontal"
            />
        <TextView 
            android:text="判定せよ!" 
            android:id="@+id/textView" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:textSize="20dp"
            android:layout_gravity="center_vertical|center_horizontal"
            android:padding="10dp"
            />
        <Button
            android:id="@+id/button_right"
            android:text="受け" 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center_vertical|center_horizontal"
            />
    
    </LinearLayout>

    <!-- 次にその上部へ重ならないように ListViewを配置する -->

    <ListView 
        android:layout_height="0dip"
        android:id="@+id/listView" 
        android:layout_width="fill_parent"
        android:layout_alignParentTop="true"
        android:layout_weight="1"
        android:layout_above="@id/bottom_control"
        />

</RelativeLayout>

実際の表示例は、以下となる。


※ボタンのキャプションおよびテキストは気にしないでください。


上記イメージは、実際の eclipse上でのプレビューのもの。青い枠は、選択状態の ListViewを示しているのだが、その領域が、下部の LinearLayoutの領域とかぶっていないことがわかると思う。


※その2もあります→ http://d.hatena.ne.jp/windbell/20120701#p1
#RelativeLayoutを使わないで同じことをやっています