いまさらFragmentを試してみる

# はじめに
Androidのプログラムを初めて何年も経つけどFragmentを触ったことがほとんどないというちょっと恥ずかしいかもしれない告白ｗ
まぁ、SurfaceViewに描画してゲーム作る程度なのでFragment無くてもよかったというのもあるけど。
最近、お仕事でもAndroidのコードに触れる機会もあり、そろそろちゃんと分かっておかないと、やばい！
というわけで、ネットで何かないかな？と探してたらあったので試してみる。

参考にしたのはこちら
[Android はじめてのFragment](https://qiita.com/Reyurnible/items/dffd70144da213e1208b)

いや、ほんと初めてみたいなものなのでｗ
上記のページを参考にしたところ、LegacyになってるRelativeLayoutを使てたり、知識の足りないせいで思うようにいかないところがあったりと、久々にAndroidのコード書いてよいウォーミングアップになりました。

とりあえず、参考サイトの内容をなぞるように書くなら、参考サイトを見てもらえばいいので、個人的に調べたことを追加しつつ、適当に端折りながら書いていきます(自分が後で参考にできればいいくらいの気持ちで)

# Androidのプロジェクトの作成

Empty Activityでプロジェクトを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/26a5299a-6fe9-6b4e-520a-70698383d9f7.png)

今のトレンドならKotlinがいいと思いますが、Javaを選んでやりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/11a1bb34-e98c-fbe6-0d99-8f5121d9c6bd.png)

# Fragmentのレイアウトとクラスの作成

こんな感じでレイアウトを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/d2d350f9-638d-291f-f8ac-09cc2663d31e.png)

で、作ったレイアウトを開いて、TextViewとButtonを追加します。
あと、LinerLayoutのlayout_widthをmatch_parent、layout_heightをwarp_contentにします。
こんな感じになっていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/990d5e76-217f-87f3-265b-84929b7dd7bb.png)

次にFragmentを実装したクラスを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/8f6e701a-52ac-5a8b-d95e-25e9e806ef4f.png)

クラスができたら、onCreateView()メソッドとonViewCreated()メソッドをオーバーライドして、中身を実装します。
参考元そのまんまですが、

```java:MainFragment.java
public class MainFragment extends Fragment {

    private TextView mTextView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState) {
        super.onCreateView(inflater, container, saveInstanceState);
        return inflater.inflate(R.layout.fragment_main, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle saveInstanceState){
        super.onViewCreated(view, saveInstanceState);
        mTextView = view.findViewById(R.id.textView);
        view.findViewById(R.id.button).setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                mTextView.setText(mTextView.getText() + "!");
            }
        });
    }
}
```
onCreateView()メソッドは、Fragmentが最初にUIを描画するときにシステムから呼び出されるメソッドになります。
なので、ここで、FragmentにViewを設定しています。
ちなみに、FragmentクラスのコンストラクタにリソースIDを指定したり、@ContentViewアノテーションで指定できるらしいのですが、今回試したSDKのバージョン(26)ではできなかった。
どこかでこの辺は調べて明確にしておきたいところ。

onViewCreated()メソッドは、公式の[フラグメント](https://developer.android.com/guide/components/fragments?hl=ja)のサイトのライフサイクルの図には登場しませんが、onCreateViewメソッドの後にシステムから呼び出されるメソッドです。
初期化処理はonCreateView()ではなくonViewCreated()でやってねと公式の(Fragmentのリファレンス)[https://developer.android.com/reference/kotlin/androidx/fragment/app/Fragment.html#oncreateview]に書いてあります。
なので、onViewCreated()メソッドで初期化処理を行っています。

# ActivityにFragmentを追加する

レイアウトに追加してもいいんですが、コードで追加する方法が好みなので、コードでFragmentをActivityに追加します。
Activityのコードはこんな感じ。

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MainFragment fragment1 = new MainFragment();
        MainFragment fragment2 = new MainFragment();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.add(R.id.container, fragment1);
        transaction.add(R.id.container, fragment2);
        transaction.commit();
    }
}
```

同じフラグメントを追加したかったのでこんな感じになっています。
参考元だと、

```java
transaction.add(R.id.container, fragment1);
```

上記をもう一度呼び出せばいいように読めますが、上記を2回呼び出すと、落ちます。
なので、MainFragmentクラスのインスタンスはそれぞれ作る必要があります。

これで、ActivityにFragmentを追加することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277984/09c8e66f-efa3-bdb7-24ed-e91cc55c851c.png)


さてさて、今回はここまで。
もう少し、Fragmentを使うシーンを考えて実装したいところ。
何か考えよう。

# 参考
[Android はじめてのFragment](https://qiita.com/Reyurnible/items/dffd70144da213e1208b)
[Fragmentの初期化はonViewCreatedかonActivityCreatedで](https://medium.com/@star_zero/fragment%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%AFonviewcreated%E3%81%8Bonactivitycreated%E3%81%A7-b9646c36680c)
[知らずに作って大丈夫？Androidの基本的なライフサイクルイベント31選](https://www.atmarkit.co.jp/ait/articles/1604/04/news011_3.html)