ユーザインターフェース

原文: http://developer.android.com/guide/topics/ui/index.html

                                                                                                              • -

Androidアプリケーションでは、View(ビュー)とViewGroup(ビューグループ)オブジェクトを利用してユーザインターフェースを作成します。ViewとViewGroupには数多くの種類が存在しますが、それは全てViewクラスの派生クラスとなります。

ViewオブジェクトはAndroidプラットフォーム上に表示されるユーザインターフェースの基本単位です。Viewクラスは、テキストフィールドやボタンのようなUIオブジェクトである”ウィジェット”と呼ばれるクラスの基底クラスです。一方、ViewGroupクラスは、線形、表形式、相対形式といった様々なレイアウトアーキテクチャを提供する”レイアウト”と呼ばれるクラスの基底クラスです。

Viewオブジェクトは、レイアウトのパラメータや、画面上の特定の四角形の領域の情報を保持することができ、その領域の大きさ、レイアウト、描画コンポーネント、フォーカスの変更、スクロール、キー/ジェスチャーなどを管理します。Viewはユーザインターフェース上のオブジェクトとして、ユーザとイベントを受け取るレシーバとの橋渡し役を担います。


【ページ内目次】

View構成

Androidプラットフォームでは、下記の図にあるように、ViewとViewGroupを利用してアクティビティのUIを定義します。この階層ツリーは必要に応じてシンプルな構成にも複雑な構成にもできます。Androidで標準提供されているウィジェットやレイアウトを使うこともできますし、自身で作成したオリジナルのViewを使ってツリーを組み立てることもできます。


ビュー階層を画面上に描画するために、ActivityはsetContentView()メソッドを呼び、View階層のルートノードのオブジェクトを渡さなければなりません。そのオブジェクトを受け取ったAndroidシステムは、無効化、計測、ツリーの描画といった処理を行います。一方、階層のルートノードは、その子ノードに子ノード自身を描画するよう要求します。同様に、各ビューグループは自分の子ビューを呼び出して描画処理を実行させます。子ビューは、親ビューに対して自分達が収まることができるサイズや位置であることを要求しますが、どの大きさにするかの最終的な判断は親ビューが行います。Androidはレイアウトの要素を(階層ツリーのトップから)順に解析し、Viewのオブジェクトを生成し、親オブジェクトに追加していきます。要素の位置が重複した場合は、最後に描画されたオブジェクトが以前に描画されたものの前面に表示されます。

ビュー階層の解析や描画方法の詳細は、「Androidがビューを描画する方法」を参照してください。

レイアウト

レイアウトを定義し、View階層を表現するもっとも一般的な方法は、XMLファイルを利用することです。XMLは、HTMLのように人が読んでわかりやすい構造になっています。XMLの各エレメントは、ViewかViewGroup(もしくはそれらの派生クラス)になります。Viewオブジェクトはツリーの葉の部分で、ViewGroupはツリーの枝の部分に位置します(上記のビュー階層の図を参照してください)。

XMLエレメントの名前は、エレメントが実行するJavaクラスを表しています。エレメントはUI上でTextViewのオブジェクトを生成しますし、エレメントはLinearLayoutというViewGroupを生成します。Androidがレイアウトリソースの読み込む際、レイアウトの各エレメントに対応する上記のようなランタイムオブジェクトを生成します。

具体例として、テキストビューとボタン付きのシンプルなレイアウトを以下に示します。


    
    


LinearLayoutエレメントがTextViewとButtonを含んでいることに注目してください。ここに別のLinearLayout(もしくは他のViewGroupでも可)をネストして、ビュー階層を長くし、より複雑なレイアウトを作成することもできます。

UIレイアウトの組み立てに関する詳細は、「レイアウトの宣言」を参照してください。

ビューを組み立てる方法は他にもたくさんあります。違うタイプのViewGroupを使えば、色んなやり方で子ViewやViewGroupを組み立てることができます。AndroidからはLinearLayout, RelativeLayout, AbsoluteLayout, TableLayout, GridLayoutといったViewGroupが標準で提供されています。それぞれが、異なるレイアウトパラメータを持っており、子Viewの位置やレイアウト構造を定義することができます。

レイアウトで使用するViewGroupの詳細は、「よく使うレイアウトオブジェクト」を参照してください。


JavaソースコードからViewやViewGroupを描画することもできます。addView(View)メソッドを読んで、新規のViewやViewGroupオブジェクトを直接インサートしてください。

ウィジェット

ウィジェットとは、ユーザとのインターフェースとなるViewオブジェクトです。Androidでは、ボタン、チェックボックス、テキスト入力フィールドなど、多数のウィジェットを標準で提供しており、UIを効率良く開発することができます。Androidから標準で提供されているウィジェットの中には、日付ピッカー、時計、ズームコントロールなど複雑なものもあります。しかしながら、Androidプラットフォームで提供されるウィジェットに縛られることはありません。自分でViewオブジェクトを作成し、既存のウィジェットと組み合わせることもできますし、自分だけのウィジェットを独自に作成することもできます。

詳細は「カスタムコンポーネントの開発」を参照してください。

Androidで提供されているウィジェットリストは、android.widgetパッケージを参照してください。

UIイベント

ビューやウィジェットをUIに追加した後は、ユーザが何らかの処理をしたことをどうやって受け取るのかについて知りたいと思うかもしれません。UIのイベントを受け取るには、以下の2つのうちどちらかを実行する必要があります。

  • イベントリスナーを定義し、Viewに登録する
    • たいていの場合は、この方法でイベントを受け取ります。Viewクラスは、On()でイベントが発生した際に呼ばれるOnListenerという名前のインターフェースを持っています。例えば、View.OnClickListener(Viewのクリックイベント処理)、View.OnTouchListener(View内のタッチスクリーンイベント処理)、View.OnKeyListener(View内の端末キー押下イベント処理)などです。もし、(ボタンが選択されたなどのように)クリックされたことをビューに通知したい場合には、OnClickListenerを実装し、onClick()のコールバックメソッドとしてsetOnClickListener()を利用してViewに登録します。
  • Viewにある既存のコールバックメソッドをオーバーライドする
    • 自分でViewクラスを実装し、そこで発生する特殊なイベントを受け取りたい場合に、この方法を使います。イベントの例として、スクリーンがタッチされたとき(onTouchEvent())、トラックボールが動かされたとき(onTrackballEvent())、端末キーが押されたとき(onKeyDown())などが挙げられます。この方法により、カスタムビューの中で各イベントに対するデフォルトの振る舞いを定義し、イベントを他の子ビューに渡すかどうかを決定することができます。もう一度言うと、コールバックメソッドはViewクラスにあるので、カスタムViewを開発したときにだけ、デフォルトの振る舞いを定義することができます。

ユーザとViewとの対話に関しては、「UIイベントのハンドリング」で続きを読むことができます。

メニュー

アプリケーションメニューは、アプリケーションUIにおいて、重要なパートの1つです。メニューでは、アプリケーションの機能や設定を公開するために、信頼あるインターフェースを提供します。最もよく目にするアプリケーションメニューは、端末のMENUキーを押した際に表示されるメニューだと思います。ただし、ユーザがある項目を押下した際に表示されるコンテキストメニューを独自に追加することもできます。

メニューもView階層を利用して構成されますが、メニュー自身がその構造を定義したりはしません。代わりに、アクティビティのonCreateOptionsMenu()やonCreateContextMenu()のコールバックメソッド内で、メニューに含めたい項目を宣言します。Androidは必要なときに自動的にメニューのView階層を作成し、その中に先ほどのメニュー項目を描画します。

メニューはイベントを処理することもできるため、メニュー項目にイベントリスナーを登録する必要はありません。メニュー項目が選択された際は、onOptionsItemSelected()かonContextItemSelected()がフレームワークから呼ばれます。

アプリケーションレイアウトと同様に、XMLファイルでメニュー項目を宣言することもできます。

詳細は「メニュー作成」を参照してください。

応用編

ユーザインターフェース作成の基礎が掴めたら、もっと複雑なアプリケーションインターフェースを作成できる高度な機能も見てみましょう。

アダプタ
ViewGroupにハードコードできないようなデータを埋め込みたい、つまり外部ソースのデータをビューにバインドしたい場合は多いはずです。その場合は、ViewGroupにAdapterView(アダプタビュー)を使用することで、生成された子Viewにアダプタのデータが埋め込まれます。

AdapterViewは、ViewGroupの実装クラスで、渡されたアダプタオブジェクトをもとに、描画する子Viewを決定します。アダプタはデータソース(外部文字列の配列など)とAdapterView間のキャリアのような振る舞いをします。アダプタには、例えばカーソルからデータベースのデータを読み込むCursorAdapterや、任意の配列からデータを読むArrayAdapterなど、各タスクごとに実装クラスが複数存在します。

アダプタの使用に関する詳細は、「AdapterViewへデータをバインドする」を参照してください。

スタイルとテーマ
恐らく標準で提供されているウィジェットの見た目に満足できない場合も出てくるはずです。Androidでは、独自のスタイルとテーマを作成して、標準のウィジェットを修正することができます。

  • スタイルとは、フォーマット用の属性群のことであり、レイアウト内の各エレメントに適用することができます。例えば、任意のテキストサイズやカラーをスタイルで指定し、特定のViewエレメントにだけ適用するといったことも可能です。
  • テーマもまた、フォーマット用の属性群のことであり、アプリケーション内の複数のアクティビティや、もしくは単一のアクティビティに対して適用することができます。例えば、テーマを利用して、ウィンドウフレームやパネルのバックグラウンドカラーを指定したり、メニューのテキストサイズやカラーを指定したりすることができます。テーマは特定のアクティビティに対してのみか、アプリケーション全体のどちらかに適用することが可能です。

スタイルとテーマはリソースの一種です。デフォルトのスタイルやテーマをそのまま使うこともできますし、独自のカスタムスタイルやテーマを宣言することもできます。

スタイルやテーマの使用に関する詳細は、「スタイルとテーマの適用」を参照してください。

                                                                                                                        • -


Android翻訳目次へ