画面要素の階層構造

Androidアプリケーションの基本的な機能単位は、android.app.Activity クラスのオブジェクトである『アクティビティ』です。アクティビティは様々なことが出来ますが、それ自体は画面に表示されません。アクティビティを画面上に表示し[※1] 、UIをデザインする[※2] ためには、Androidプラットフォームのインターフェイス基本単位であるビュー(view)やビューグループ(viewgroup)について知る必要があります。

ビュー

ビューは、android.view.View クラスのオブジェクトです。これは画面上における特定の矩形エリアについてのレイアウトやコンテンツを格納するための[※3] データ構造です。Viewのオブジェクトは、それ自体が存在する画面エリアに対する計測[※4] やレイアウト、描画、フォーカス変更、スクロール、キーやジェスチャーを処理します。

Viewクラスはウィジェット(インタラクティブな画面要素を構成する)の基本クラスでもあります。ウィジェットは(訳注:ビューと同様に)、それ自体の計測、描画を処理し、UI構築を素早く行えるようになっています。ウィジェットには、Text, EditText, InputMethod, MovementMethod, Button, RadioButton, Checkbox, ScrollViewといったものがあります。

ビューグループ

ビューグループは、android.view.Viewgroup クラスのオブジェクトです。その名前から分かるようにビューグループは、ビューや他のビューグループを含み、管理するための特殊なビューオブジェクトです。これを使うことで、UIの構造化や、複雑な構造を持つ画面要素を一つにまとめることが出来ます。

また、Viewgroupクラスは一般的な画面レイアウトを提供するレイアウト(layout)の基本クラスでもあります。レイアウトにより、ビューのセットを構造化することが出来ます。 [※5]

UIのツリー構造

Androidプラットフォームにおいては、以下の図にあるようにビューとビューグループのツリーによりActivityのUIを定義します。このツリー構造は、必要に応じてシンプルにも複雑にも出来、Androidにより既に定義されているウィジェットやレイアウト、あるいは自身で作成するカスタムビューにより構成することが出来ます。

An example of a tree of views and viewgroups

ビューのツリーを画面にレンダリングするために、Activityはrootノードオブジェクトの参照を引数としてsetContentView()メソッドを呼び出します。Androidシステムはrootノードの参照を得ると、そのノードと直接連携を行い画面エリアの無効化、計測、描画といった一連の処理を行うことが出来ます。Activityがアクティブになりフォーカスを得ると、システムはアクティビティに対してその旨の通知が送信されると共に、rootノードに対してUIツリーの計測・描画を要求します。これを受けてrootノード側では子ノード群に対してそれぞれの描画を要求します(ツリー内のあるビューグループは、その直下にある子ノードの描画のみを担当します)。

前述のように、それぞれのビューグループは利用可能な場所を計測し、子ノードをレイアウトし、各子ノードがそれぞれのUI描画を行うようDraw()メソッドを呼び出す必要があります。子ノード側からはサイズや位置について親ノードに対して要求を行うことが出来ますが、子ノードの最終的な描画サイズや位置は親ノードにより決定されます。

レイアウトパラメータ: 子ノードが位置とサイズを指定するためには

全てのビューグループクラスはViewGroup.LayoutParams クラスを拡張した、ネストしたクラスを利用します[※6] 。このクラスは、それぞれのビューグループクラスに合った、[※7] 子ノードのサイズと位置を定義するプロパティを持っています。

An example of layoutparams

LayoutParamsのサブクラスは、それぞれに値の設定方法を持っていることに注意してください。子ノードはそれぞれ、親のクラスに合ったLayoutParams(子のクラスに合ったものではなく)を定義する必要があります。

全てのビューグループは幅(width)と高さ(height)を持ちます。多くのビューグループは、併せて余白(margin)と枠線(border)を持ちます。幅と高さを厳密に指定することが出来ますが、使える限り大きな領域を取るような指定を行うことも多いでしょう。[※8]