一般的なレイアウトオブジェクト

以下に、アプリケーション構築において最もよく使われるであろうビューグループを示します。このページの内容は概要説明に留まっていますので、更なる詳細はそれぞれのリンク先にあるリファレンスをお読み下さい。

FrameLayout

FrameLayoutは最も単純なレイアウトオブジェクトです。これは、後から単一のオブジェクトを描画するために画面上の場所を確保するためのものです。例えば、画像読み込み用の領域[※1] などに使います。FrameLayoutにおいて子要素は全て画面の左上に固定され、他の位置を指定することは出来ません。透明な要素を除き、この領域内の描画内容は部分的に、あるいは全体が新しいもので上書きされていきます。[※2]

LinearLayout

LinearLayoutは指定されたプロパティに従い全ての子要素を縦あるいは横に一直線で並べるものです。例えば縦に並べる場合、子要素はサイズが異なっていても1行ごとに一つずつ並んで表示されます。横向きのリストについても同様で、全体の高さは子要素のうち最も縦幅が大きなものに合わせられます。LinearLayoutでは子要素間の余白情報や右寄せ、中央寄せ、左寄せといった配置情報に従った配置を行います。

LinearLayoutでは、weightにより各子要素に重み付けを行うことが出来ます。これを使うことで、子要素に画面の余っている領域全てを使わせることが出来ます。こにより、小さなオブジェクトが広い画面のすみに固まって表示されるのではなく、画面上で使える領域全てに広げることが出来ます。デフォルト値は0ですが、子要素側で重み情報を指定すると、その大きさに応じた表示が為されます。例えば3つのテキストボックスがあり、ボックス1とボックス2にweight=1を設定した場合、ボックス3は元のサイズのままですがボックス1とボックス2は画面上の空き領域を使い切るよう、同じサイズに拡張されます。

ヒント: 画面上に可変サイズのレイアウトを作成したい時には、fill_parent指定のかかったコンテナオブジェクトを作成した上で、子要素の幅あるいは高さを0にし、各子要素の相対ウェイト値指定をかけます。

以下に示す2つのフォームはLinearLayout上にボタン、ラベル、テキストボックスを配置しています。共に、見栄えをよくするためにpadding値を指定してあります。テキストボックスの幅はFILL_PARENTに指定されており、それ以外はWRAP_CONTENTになっています。デフォルトの配置は左側です。左側のフォームでは、weight値をデフォルト値0のまま、特に指定していません。右側のフォームではCommentsテキストボックスのweight値を1にしています。ここでNameのweightも1にすると、NameとCommentsは同じ高さに調整されます。

Linear layout with weight attribute

横向きのLinearLayoutにおいて子要素はベースライン(最初の子要素の最初の行、つまり最も左端あるいは上端の部分)に調整されます。これは並んだ要素の位置が上下し見難くなってしまうことを防ぐための機能ですが、レイアウトXMLにおいてandroid:baselineAligned="false"を指定することで無効化できます。

TableLayout

TableLayoutでは、子要素を表状に並べます。TableLayoutは行を定義するいくつかのTableRowオブジェクトにより構成されます(実は他の要素を子に持つことも出来るのですが、それについては後述します)。TableLayoutコンテナ自体が行、列、セルの枠線を表示することはありません。各行にはそれぞれが1つのビューオブジェクトを持つ、0個以上のセルを含むことが出来ます。[※3] 表自体は、その中で最もセル数の多い行と同じ数のカラムを持ちます。[※4] 表内のセルは空のままにしておくことも出来ますが、HTMLのようにセル同士を結合することは出来ません。以下の図は表レイアウトについて、本来見えないセル枠を点線で示したものです。

TableLayout example

各カラムは非表示にしたり、画面上の空き領域全てを使うよう設定したり、表が画面サイズに合うよう幅を縮めたりすることが出来ます。詳細についてはクラスのリファレンスをお読み下さい。

AbsoluteLayout

AbsoluteLayoutを利用すると、子要素側で表示位置を画面の左上端を(0,0)とし、右下へ行くほど値が大きくなる絶対座標で指定することが出来ます。余白指定はサポートされていませんが、要素の重ね表示[※5] は非推奨ながらも可能です。デバイスごとに見た目が変わってしまう恐れがあるので、特別な理由が無い限りAbsoluteLayoutの利用はお勧めしません。

RelativeLayout

RelativeLayoutでは、親要素に対する相対位置指定、あるいはID指定による子要素間での相対表示位置指定を行うことが出来ます。これを使うと、要素を右端に揃えたり、ある要素を他の要素の下に配置したり、画面の中央に配置したりすることが出来ます。要素は指定順に描画されるので、例えば最初の要素を画面の中央に配置した場合、他の要素は画面の中央からの相対位置指定にて描画されます。後述するようにXMLでのレイアウト指定を行う場合、参照される側の要素が参照を行う側の要素より前に書かれている必要があります。

可視要素・不可視要素の外枠を含めて描画した、相対レイアウトの例を以下に示します。rootの画面レイアウトオブジェクトは、RelativeLayoutオブジェクトを利用しています。

RelativeLayout screen with elements highlighted

図上には画面要素のクラス名とそれらのプロパティリストを示してあります。プロパティの中には要素自体がサポートしているものもありますが、オブジェクト内のLayoutParamsメンバ(この場合、画面上の全要素はRelativeLayoutのオブジェクトにぶら下がっているので、RelativeLayoutのサブクラスとなります)によりサポートされているものもあります。RelativeLayoutのパラメータはwidth、height、below、alignTop、toLeft、padding、marginLeftです。これらのうちtoLeft、alignTop、belowといったプロパティを利用すると、他の子要素に対する相対位置指定が可能です。

重要なビューグループの概要

以下のオブジェクトは、子UI要素を持ちます。またこれらには、目に見えるものがある一方で子要素のレイアウト処理を行うだけのものもあります。

Class Description
AbsoluteLayout ピクセル値などを使って、子オブジェクトの位置を親オブジェクトからの正確な相対位置で指定することが出来ます。
FrameLayout 単一オブジェクトを表示するためのビューフレームとして動作するレイアウトです
Gallery 水平にスクロール出来る画像ギャラリを作成出来ます[※6]
GridView n行m列のスクロール出来るグリッドを表示します
LinearLayout 子要素を水平あるいは垂直の列に構成するレイアウトです。ウィンドウサイズが画面サイズを超えた場合にはスクロールバーを表示します。
ListView スクロール出来る単一の列リストを表示します。
PopupList 自由な場所に表示出来る、枠線付きのポップアップリストです。[※7]
RelativeLayout 子要素Aを子要素Bの左に表示する、というような子要素間相対位置指定を行ったり、親要素の上端に表示する、といった親要素に対する相対位置を行うことの出来るものです。
ScrollView 要素を縦1列に並べ、スクロールさせられるものです。
Spinner 1行表示のテキストボックスに入れる値を複数値のリストから選べるものです(訳注:一般に言う、ドロップダウンリストか)。これは縦あるいは横に1つずつしか表示できないリストボックスに似ています。
SurfaceView 描画サーフェスに対する直接アクセスを行うことが出来ます。サーフェス上の子ビューを保持することが出来ますが、ウィジェットを利用するアプリケーションよりはピクセル描画を行うアプリケーション向きです。
TabHost タブの選択肢リストを表示し、タブがクリックされるとアプリケーション側で画面を切り替えられるようにする機能を提供します。[※8]
TableLayout 可変数の行・列から成り、それぞれのセルがプログラム上で指定されたウィジェットを表示出来る、表レイアウトです。行の幅は表中の最大カラムに調整されます。セルの枠線は表示されません。
ViewFlipper 1行のテキストボックス内に一度に一つのアイテムを表示出来るリストです。スライドショーのように、一定時間おきに表示アイテムを切り替えるような使い方が出来ます。
ViewSwitcher ViewFlipperと同じです