【Android】Androidの基本を覚えた後に覚えたいこと～はじめてのFragment①～

今更なのですが、初めてFragmentを使いました。
基本的なことから調べたので、まとめます。

# Fragmentとは
Activityの中に組み込むことができるコンポーネントの一つ。
Android3.0(API level11)から導入された。
特徴は以下の通り。

* UIを持つ
* 独自のライフサイクルを持ち、イベントも受け付けることができる
* Activityに組み込んで使用する
* 1つのFragmentを複数のActivityで使いまわすことができる
* 1つのActivityに複数のFragmentを組み込むことができる

# 具体例

タブレットと普通のスマホの両方に対応させるアプリを作成する場合。

![tablet.jpg](https://qiita-image-store.s3.amazonaws.com/0/45528/fbe59d54-668c-b7cb-2b0a-00692500190d.jpeg)

上記の画面をタブレットとする。
左のメニューリストで選んだ項目の内容を右のコンテンツ領域に表示させることとする。
Fragmentを使用すると、左のメニューリストをFragmentA、右のコンテンツをFragmentBとして作成し、ひとつのActivityで表示し、操作することができる。

![handset.jpg](https://qiita-image-store.s3.amazonaws.com/0/45528/11cd9c77-afe8-1340-a3ac-a8e2a816f2bc.jpeg)

上記の画面をスマートフォンとする。
スマートフォンの場合、タブレットに比べて画面が小さいため、一つの画面でメニューリストとコンテンツを表示させることはできない。
この場合は、画面Aでメニューを選択し、画面Bでコンテンツを表示させる。
タブレットと違い2つのActivityを準備しなければならないが、それぞれのActivityではタブレットのときに使用したFragmentA、FragmentBをそれぞれ使用することができる。

このように、ひとつのActivityで複数のFragmentを使用したり(タブレットの例)、複数のActivityでFragmentを使いまわす(タブレットとスマホどちらにも対応させる)ことが可能となる。
固有のレイアウト、ライフサイクルとふるまいを持つことができる、というFragmentの特徴があるため、このようなことが可能になる。

# Fragmentのライフサイクル

Fragmentを使用する場合は、Fragmentクラス、もしくはそのサブクラスを継承したクラスを作る必要がある。その際、以下のようなコールバックメソッドがある。

|コールバックメソッド| |
|:--------------------|:---|
| ≪Fragment is added≫||
| onAttach()|FragmentがActivityにひもづいたときに呼ばれる|
|onCreate()| Fragmentが生成されたときに呼ばれる|
|onCreateView()|FragmentのUIが最初に描画されたときに呼ばれる|
|onActivityCreated()|ActivityのonCreate()が終了(return)したときに呼ばれる|
|onStart()||
|onResume()||
|≪Fragment is active≫||
|onPause()||
|onStop()||
|onDestroyView()|バックスタックから戻った場合はonCreatView()へ|
|onDestroy()||
|onDetach()|ActivityからFragmentが切り離されたときに呼ばれる|
|≪Fragment is destroyed≫||

# FragmentにUIを追加する

UIを持つFragmentを作成する場合には、UIをFragmentに追加する処理をしなければならない(UIを持たないFragmentを作成することもできる)。
Fragmentクラスを継承したクラスでonCreateView()を実装し、XML形式のレイアウトをinflateすることで、UIをFragmentに追加できる。

```lang:SampleFragment.java
public static class SampleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.sample_fragment, container, false);
    }
}
```

R.layout.sample_fragmentがFrgamentのUIになるレイアウトファイルである。


# FragmentをActivityに追加する

方法は2つある。
### レイアウトファイルに\<fragment>タグを追加する
Activityで使用するレイアウトファイルに\<fragment>タグを追加することで、FragmentをActivityに追加できる。

```lang:layout_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment android:name="com.example.SampleFragment"
            android:id="@+id/sample_fragment"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>
```

android:name　追加するFrgementクラスを指定
android:id　　ユニークなid
android:tag　 ユニークなタグ(上の例では使っていません)

### コードの中で追加する

Activityの中でFragmentTransationを作り、Fragmentを追加することができる。

```lang:main.java
// FragmentTransactionを作成
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// Activityに追加
SampleFragment fragment = new SampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
```

add()の第一引数は、Fragmentを挿入する部分のレイアウトファイルのid、第二引数は挿入するFragmentである。


# 参考
http://developer.android.com/guide/components/fragments.html