Fragment上にTabLayoutを実装する方法[Kotlin][Android][アプリ開発]

<h2>当記事でわかること</h2>
・Fragment上にTabLayoutを実装する方法<br>
・Fragment上にFragmentを重ね、Fragmentを切り替える方法

<h2>背景</h2>
アプリ制作中にイマドキアプリにありがちな一つの画面内にて、<br>
スワイプで切り替えてコンテンツの表示を制御する実装(例:TwitterのHOME)を行いたく、<br>
調査したが意外と行っている人が少なかったため、<br>
備忘録として残したくなりました。<br>
こちらの記事を参考することで以下の画像のようなレイアウトを作成することができます。

<img width="300px" alt="スクリーンショット 2022-11-16 13.30.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727972/88edc622-b6fd-8424-4be8-6b49101f9542.png">


<h2>大前提(必読)</h2>
Fragmentとは、Activity上にあるライフサイクルを持った<font color="Salmon">View</font>です。
<br>＊こちらの記事ではFragmentへの理解を前提としております。
<br>
また、OSバージョンやエディタ環境のテストは、

筆者環境以外では行っていないため留意ください。
また、今回は非推奨となったFragmentPagerAdapterを使用する方法のため、<br>そちらもご了承くださいませ。(時間が出来次第推奨のやり方で記事出します。。)

<h2>コード</h2>
<h6>STEP1.土台のHomeFragmentを作成</h6>
「例えるなら机です。」

```kotlin:HomeFragment.kt
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?

    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.activity_home_fragment, container, false)

    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        pager.adapter = PageAdapter(childFragmentManager)
        tabLayout.setupWithViewPager(pager)
    }
```

<h6>STEP2.TabLayoutをfragment_home.xml(HomeFragmentのxmlファイル)に実装</h6>
「例えるならお茶碗です。」

```kotlin:fragment_home.xml
<com.google.android.material.tabs.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:tabSelectedTextColor="#5c9ead"
        app:tabTextColor="@color/colorgreen">

        <com.google.android.material.tabs.TabItem
            android:id="@+id/first"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="first" />

        <com.google.android.material.tabs.TabItem
            android:id="@+id/second"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="second" />

        <com.google.android.material.tabs.TabItem
            android:id="@+id/third"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="third" />
    </com.google.android.material.tabs.TabLayout>
```

<h6>STEP3.今回切り替えたいFragmentを任意の数作成(当記事は3個にしてます)</h6>
「例えるなら白米・玄米・炊き込みご飯です。」
<br>
fragment内部には実装内容のみで大丈夫です。<br>
今回は例としてonCreateView()を軽く記載しております。

```kotlin:FirstFragment.kt
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?

    ): View? {
        super.onCreateView(inflater, container, savedInstanceState)
        return inflater.inflate(R.layout.fragment_first, container, false)
    }
```

```kotlin:SecondFragment.kt
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?

    ): View? {
        super.onCreateView(inflater, container, savedInstanceState)
        return inflater.inflate(R.layout.fragment_second, container, false)
    }
```

```kotlin:ThirdFragment.kt
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?

    ): View? {
        super.onCreateView(inflater, container, savedInstanceState)
        return inflater.inflate(R.layout.fragment_third, container, false)
    }
```



<h6>STEP4.Adapterを作成</h6>
「例えるならしゃもじです。」

補足:AdapterはTabをスワイプした際にFragment切り替えを行う際に必須です。

```kotlin:PageAdapter.kt
   class PageAdapter(fm: FragmentManager) : FragmentPagerAdapter(
    fm,
    BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
) {
    override fun getItem(position: Int): Fragment {
        return when (position) {
            // どのFragmentを表示するか
            0 -> {
                FirstFragment()
            }
            1 -> {
                SecondFragment()
            }
            2 -> {
                ThirdFragment()
            }
            else -> {
                FirstFragment()
            }
        }
    }

    // スワイプビューの数が３つだから
    override fun getCount(): Int {
        return 3
    }

    // スワイプビューのタイトルを決める
    override fun getPageTitle(position: Int): CharSequence? {
        return when (position) {
            0 -> {
                "First"
            }
            1 -> {
                "Second"
            }
            2 -> {
                "Third"
            }
            else -> {
                null
            }
        }
    }
}
```
<h2>参考にした記事</h2>

[Android Fragmentの中にタブ付きスワイプビューを作る（kotlin）](https://qiita.com/kokogento/items/383afccd6eef2b029ecd)