サンプルプロジェクト作成
では、今回使用するサンプルアプリを作成していきましょう。
プロジェクト情報
以下が今回使用するサンプルアプリのプロジェクト情報です。
| Application name | FragmentSample |
|---|---|
| Company Domain | android.wings.websarva.com |
| Package name | com.websarva.wings.android.fragmentsample |
| Project location | C:\…任意のワークフォルダ…\FragmentSample |
| Phone and Tablet Minimum SDK | API 15 |
| Add an activity | Empty Activity |
| Activity Name | MenuListActivity |
| Layout Name | activity_menu_list |
フラグメントの追加
まず、strings.xmlはダウンロードサンプルを参照してください。なお、ダウンロードサンプルは、次回の改造も含めたソースコードとなっているのでご了承ください。
先述のとおり、フラグメントはxmlファイルとJavaクラスのセットで成り立っているので、リスト用のフラグメントのセットを追加します。Fileメニューから「New」-「Fragment」-「Fragment(Blank)」を選択してください。以下のようなウィザード画面が表示されます。
以下の情報を入力し、「Finish」をクリックしてください。
| Fragment Name | MenuListFragment |
|---|---|
| Create layout XML? | チェックを入れる |
| Fragment Layout Name | fragment_menu_list |
| Include fragment factory methods? | チェックをいれない |
| Include interface callbacks? | チェックをいれない |
| Target Source Set | main |
すると、所定の位置にMenuListFragmentクラスとfragment_menu_list.xmlファイルが追加されています。
MenuListFragmentを見てください。クラス宣言のところが
public class MenuListFragment extends Fragment
となっています。フラグメントのJavaクラスは、その名のとおりFragmentクラスを継承して作ります。
フラグメントのライフサイクル
フラグメントを導入すると、画面構成と処理は、そのほとんどをフラグメントに記述することになります。まず、IntentSampleのactivity_menu_list.xmlの内容をそのままfragment_menu_list.xmlにコピーしてください。
次に、MenuListFragmentのonCreateView()メソッドに以下のソースコードを記述します(コンストラクタがあらかじめ記述されていますが、こちらは削除しても構いません)。
public class MenuListFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_menu_list, container, false); // (1)
ListView lvMenu = (ListView) view.findViewById(R.id.lvMenu); // (2)
return view; // (3)
}
}
フラグメントは、画面の一部をブロック化したものなので、アクティビティ同様にライフサイクルを持っています。さらに、それらはアクティビティと連動します。これを図にすると、下図のようになります。
この図を見て分かるとおり、リスト1でコードを記述したonCreateView()メソッドというのは、アクティビティのcreate()中の処理であり、フラグメントでは3番目に実行されるメソッドです。この段階で、このフラグメントが担当する画面構成が作られます。なので、まずしなければならない処理は、レイアウトxmlファイルから画面部品を生成することです。これがリスト1の(1)です。ここでは、onCreateView()メソッドの第1引数であるinflaterのメソッドinflate()を使って画面を生成します(infleteに関しては、前回のオプションメニューのところでも解説しています)。その際引数が3個必要です。
第1引数は、生成するフラグメントのxmlファイルのR値を渡します。
第2引数は、onCreateView()メソッドの第2引数containerを横流しします。
第3引数は通常falseとします。これは、inflateした画面ブロックのルートを第2引数とするかしないかを指定する引数です。
このinflate()メソッドの戻り値が、このフラグメント用の生成された画面ブロックなので、これをonCreateView()メソッドの最後にreturnします。これがリスト1の(3)です。
もし、生成された画面ブロックに何か動的に手を加えたい場合は、このinflate()とreturnの間に処理を記述します。その際、ブロック内の画面部品を取得する必要が出てきますが、画面部品を取得するのにActivityのように、そのままfindViewById()と記述してもコンパイルエラーとなります。これは、FragmentクラスにfindViewById()メソッドがないのが原因です。代わりとして、いまinflateされた画面ブロックであるviewのfindViewById()を使用します。これがリスト1の(2)です。ここでは、メニューリストを表示するListViewを取得しています。
