LoginSignup
1
0

More than 1 year has passed since last update.

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

Posted at

当記事でわかること

・Fragment上にTabLayoutを実装する方法
・Fragment上にFragmentを重ね、Fragmentを切り替える方法

背景

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

大前提(必読)

Fragmentとは、Activity上にあるライフサイクルを持ったViewです。
*こちらの記事ではFragmentへの理解を前提としております。
また、OSバージョンやエディタ環境のテストは、

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

コード

STEP1.土台のHomeFragmentを作成
「例えるなら机です。」
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)
    }
STEP2.TabLayoutをfragment_home.xml(HomeFragmentのxmlファイル)に実装
「例えるならお茶碗です。」
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>
STEP3.今回切り替えたいFragmentを任意の数作成(当記事は3個にしてます)
「例えるなら白米・玄米・炊き込みご飯です。」
fragment内部には実装内容のみで大丈夫です。
今回は例としてonCreateView()を軽く記載しております。
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)
    }
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)
    }
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)
    }
STEP4.Adapterを作成
「例えるならしゃもじです。」

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

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()
            }
        }
    }

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

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

参考にした記事

Android Fragmentの中にタブ付きスワイプビューを作る(kotlin)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0