「Implementing a User Interface」の一部を翻訳しました。pdf版はこちら。ユーザーインターフェースの実装 このセクションではAndroidの画面のユーザインタフェースを実装する基本的な方法を記載します。画面を作る為の基本とXMLで画面を定義してコードからロードする方法、その他ユーザーインタフェースを取り扱う為に必要な色々なタスクについて解説します。画面構成要素の階層 Androidアプリケーションの基本的な機能単位としてandroid.app.Activityクラスのオブジェクトがあります。アクティビティで様々なことをすることができますが、それ自体では画面上に何も表示しません。アクティビティを画面上に存在させ、UIを設計するには、ViewやViewグループを使います。Views Viewはandroid.view.Viewクラスのオブジェクトです。画面上の特定の矩形領域に対するレイアウトとコンテンツのプロパティを持ちます。 Viewオブジェクトは画面領域の為に画面サイズ、レイアウト、描画、フォーカス変更、スクロール、キー/ジェスチャーを扱っています。 Viewクラスはwidgets(インタラクティブに画面要素を描画するサブクラスを実装した集合)用の基本クラスを供給します。 Widgetsは測定と描画を処理するので、より早くUIを構築することができます。 利用できるインターフェースには、Text、EditText、InputMethod、MovementMethod、Button、RadioButton、Checkbox、ScrollViewがなどがあります。Viewgroups Viewgroupsはandroid.view.Viewgroupクラスのオブジェクトです。その名前が示すようにViewgroupsはViewとViewgroup配下のセットを含み、管理するための機能を機能を持つ特別なViewオブジェクトです。 ViewgroupsはストラクチャをUIに追加し、一つの実体と呼ぶことのできる複雑な画面要素を構成します。 Viewgroupクラスはレイアウト(一般的な画面レイアウトを提供するサブクラスのセット)の基本クラスを供給し、Viewのセットを構築する方法を提供します。UIのツリー構造 Androidプラットホームでは、下記の図で示すようにViewとViewgroupノードのツリーを使っているアクティビティのUIを定義します。ツリーは単純にも複雑にも好きなように作成することができ、あらかじめ定義されたwidgetsとレイアウト、自分でカスタマイズしたviewタイプを使って構成することができます。 画面にレンダリングしてツリーに関連付けるには、アクティビティで、setContentView()メソッドを呼び、ルートノードオブジェクトへの参照を渡します。 一旦Androidシステムがルートノードオブジェクトへの参照を持てば、Androidシステムはノードをダイレクトに操作し、画面の消去、測定、描画を行うことができます。 アクティビティがアクティブになり、フォーカスを受け取った時、システムはアクティビティに通知し、ルートノードにツリーを測定、描画するように要求を出します。ルートノードは子ノードの描画を要求します。(描画要求を受け取った時、ツリーの各viewgroupのノードは自分の直下の子ノードに対して描画要求する義務があります。) 上記のように各viewgroupは、利用できるスペースを測定する責任を持ち、子ノードを配置し、各子ノードにレンダリングさせるためににDraw()を呼びます。 子ノードは親ノードのサイズと位置を要求するかもしれませんが、親オブジェクトが、各子ノードのサイズと位置を最終決定します子ノードの位置とサイズの指定方法 すべてのViewgroupクラスは、ViewGroup.LayoutParamsを拡張した入れ子になったクラスを使用します。このサブクラスは子ノードのサイズと位置を定義するプロパティを含んでおり、Viewgroupクラスのプロパティに割り当てられます。 LayoutParamsサブクラスには値を設定する為に各々の文法があるので注意が必要です。各子要素は、親ノードにふさわしいLayoutParamsを定義しなければなりません。 しかし、子ノードに異なるLayoutParamsを定義することもできます。 サイズを合わせるのに頻繁に使うのは、コンテンツのサイズから計算するか、親オブジェクトのサイズまでオブジェクトのサイズを大きくすることを許可する方法です。(訳注:パラメータ指定で親オブジェクトのサイズに合わせることが出来る。)一般的なレイアウトオブジェクト 以下は、アプリケーションで使う最も一般的なViewgroupsです。各タイプについての基本的な情報を解説しています。(詳細については各項目のリンクされたページを参照してください。)FrameLayout FrameLayoutは、最も簡単なレイアウトオブジェクトです。FrameLayoutは、空白の、予約された空間としてスクリーン上に用意され、画像などの一つのオブジェクトを入れることができます。 すべての子要素はスクリーンの左上に配置されます。FrameLayoutでは子要素の位置を指定することはできません。 子要素は、以前のオブジェクトの上に上書きし、(新しいオブジェクトが透明でなければ)以前のオブジェクトを部分的に、あるいは全体的に覆い隠すことになります。LinearLayout LinearLayoutは、一つの方向にすべての子要素を配置します。その方向は-垂直または水平があり、LinearLayoutに設定したプロパティによって決まります。全ての子要素は次々にスタックされ、垂直のリストはどれだけ横幅が広くても、行ごとに一つだけ子要素を持つことになり、水平のリストは高さ(子要素の中で最も長い縦幅+パディング)をもつ一つだけの行を持ちます。 LinearLayoutは子要素の間のマージンや、重力(子要素のright、center、leftの属性)も考慮します。 子要素はweight値を指定し、残りのスペースは宣言されたweightの割合で子要素に割り当てられます。 デフォルトのweightはゼロです。 例えば3つのテキストボックスがあって、そのうち2つはweightを"1"で宣言している場合、"1"で宣言したテキストボックスは余白のスペースをいっぱいにするために等しく拡張されますが、残りのテキストボックスは拡張されません。 下図の2つのフォームは、一組の要素(ボタン、ラベル、テキストボックス)をもつLinearLayoutを表しています。 うまくパディングを調節するために両方ともパディング値を持っています。これらのテキストボックスの幅はFILL_PARENTに設定されています。(その他の要素はWRAP_CONTENTに設定)重力(gravity)はデフォルトの左に設定されています。左側のフォームはweight値が設定されていません(デフォルトの0)。 一方、右側のフォームはCommentsのテキストボックスのweightに"1"が設定されています。Nameのテキストボックスにも"1"が設定されたら、NameとCommentsのテキストボックスは同じ高さになります。ヒント:バランスのとれたレイアウトの画面を作るには、fill_parent属性のコンテナオブジェクトを作成し、子要素にゼロの高さ、または幅を割り当て、各要素が取るべき画面の割合に従った相対的なweight値を各子要素に割り当てます。 水平のLinearLayoutでは、アイテムはテキストのベースライン{最初のリスト要素の最初のライン(一番上、一番左を基準の線とみなす)}の位置に整列されます。 これはフォーム要素を目で追う時に隣のテキストを読むために視線が上がったり下がったりしないですむようにするためです。XMLのレイアウトで [...]