FragmentでUIの共通要素を作る

2015年9月2日


Fragmentを使うと、様々な場面で共通して用いるGUIの部品を作成できます。

アクティビティーの中に配置して、使い回せるので便利です。

UIのデザインとボタン処理

Fragmentは、独自にXMLを持ち、UIを記載できます。

ところが、Fragment内にボタンを置き、onClickでメソッド名を書くと、アクティビティーのメソッドを探しに行ってしまい、フラグメントのメソッドを呼んでくれません。

FragmentのonCreateView()内で、ボタン等をインフレートしたらすぐに、findViewById()でそれらのUI部品を取り出し、すかさずsetOnClickListener()で無名の View.OnClickListenerの派生クラスを作り、イベント発生時の動作を記載してしまえば、フラグメントの内部でボタン操作のイベントを処理できます。ちょっと面倒ですが、こうするしかないのかな。

アクティビティーに何か通知するならリスナを用意

フラグメント側からアクティビティーに何か通知したいのであれば、フラグメント側で、ネストクラスとして通知用のインターフェースを用意しておきます。

フラグメントを組み込むアクティビティーに、そのインターフェースを実装し、フラグメントからの通知を受け取るメソッドを実装すればOKです。

フラグメントからアクティビティーのインスタンスを参照するために、アクティビティーの参照を保持するための処理は、フラグメントのonAttach()でアクティビティーの参照がもらえるので、そこで書きます。というか、開発環境がデフォルトでそのようなコードが書かれたスケルトンコードを用意してくれている様子です。

フラグメントからピッカーなどを呼び出して使いたい

フラグメントから、日付や時刻を入力するパネルを呼び出して使う場合、入力後に結果を受け取る処理を、フラグメント内で処理してしまいたいものです。方法については、これから調べることにします。

フラグメントから別のアクティビティーの起動もOK

フラグメントから、別のアクティビティーを起動することもできます。それも、startActivityForResult()も可能です。

フラグメントからstartActivityForResult()を実行すると、onActivityResult()は、フラグメントに実装したものが実行されます。

startActivityForResult()に送るインテントのコンテキストは、そのフラグメントがつながっているアクティビティーになります。つまり、getActivity()ですぐに取得されます。それでも、フラグメントから起動した他のアクティビティーが終わったときに呼ばれるのは、そのフラグメントのonActivityResult()です。

ちなみに、onActivityResult()は、finish()を呼んで終わらなくても呼ばれます。backボタンを直接押した場合など。積極的な正常終了時は、setResult()でOKをセットしてからfinish()させておき、onActivityResult()では、resultがOKのときは結果を受け取り、そうでなければ何らかの理由で操作がキャンセルされたと解釈すればよさそうです。

ちなみに

アクティビティー開始時に、テキスト入力エリアがあると、勝手にソフトウェアキーボードが立ち上がって、見た目上邪魔なことがあります。

AndroidManifest.xmlのactivityタグ内で、

android:windowSoftInputMode="stateHidden"

と書くと、そのアクティビティー表示開始時は、ソフトウェアキーボードが開きません。これは、ボタン操作が中心で、テキストの入力がオプションとなる場面では、便利です。

ちなみに2、ホーム画面などで表示されるアプリのアイコンにつく名前は、アプリケーションの名前ではなく、最初に表示するアクティビティーのタイトルになってしまうようです。

アプリケーションの名前は、設定画面のアプリ一覧でしか見られません。

起動時にアプリ名を見せられないというのは、困った仕様ですな。

起動時のアクティビティーのXML上の名前は、ホーム画面に表示したい名前にしておいて、起動時にソースコードでアクティビティーに表示する内容を書き換えるとかしたほうがいいのかもしれない。なんだかおかしいけど。


杉原俊雄のホームページAndroidアプリ開発メモ(もくじ)

(c) 2015 Toshio Sugihara. All rights reserved.