LoginSignup
3
2

More than 3 years have passed since last update.

【Kotlin】ViewPagerでスワイプする画面を作る

Last updated at Posted at 2020-08-05

はじめに

以前にもViewPagerで画面をスワイプさせるアプリを作ったが(その時はJavaで)、どういう処理だったのか全然思い出せなかった。。。

参考にさせていただいた記事と似たり寄ったりですが、忘れないよう自分なりに記事にします。

フラグメント

ViewPagerで表示するFragment。
onCreateViewで表示するレイアウトを作成する。
※SampleFragment1のみ載せます。同じようにFragmentクラスを作成すればOK!

MainActivity.kt
class SampleFragment1 : Fragment() {

    val TAG = "BlankFragment"

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        //レイアウトの取得
        val layout = inflater.inflate('表示するレイアウトを設定', container, false)

        //アダプターで作成したBundleからページ番号取得
        val bundle : Bundle? = arguments
        pageNum = bundle?.get("pageNum") as Int

        //レイアウトに何か処理をする場合はここでやる

        //レイアウトをリターン
        return layout
    }
}

アダプター

表示するフラグメントを返す。
FragmentStatePagerAdapterを継承して作成する。

CustomPagerAdapter.kt
class CustomPagerAdapter(_fm: FragmentManager, private val fragmentList: List<Fragment>) :
    FragmentStatePagerAdapter(_fm) {

    // 表示するフラグメントを制御する
    override fun getItem(position: Int): Fragment {

        //表示するページ番号を渡す必要があったのでargumentsにbundleを詰め込んでる
        val bundle : Bundle = Bundle()
        bundle.putInt("pageNum", position)
        fragmentList[position].arguments = bundle

        //fragmentリストから表示するfragmentをリターン
        return fragmentList[position]
    }

    // viewPagerにセットするコンテンツサイズ
    override fun getCount(): Int {
        return fragmentList.size
    }
}

レイアウト

ViewPagerのみの単純なレイアウト。
共通して表示したいレイアウトがある場合、追加する。

viewpager_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

メイン

ViewPagerで表示するFragmentのリストを作成し、アダプターにセットする。そしてviewpagerレイアウトのアダプターにセットする。

MainActivity.kt
class MainActivity : FragmentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.viewpager_main)

        //fragmentリストを作成
        val fragmentList : MutableList<Fragment> = arrayListOf()
        fragmentList.add(SampleFragment1())
        fragmentList.add(SampleFragment2())

        //adapterのインスタンス生成
        val adapter = CustomPagerAdapter(supportFragmentManager, fragmentList)
        viewPager.adapter = adapter
    }
}

以上!!!

あと、ページスワイプ時に処理がしたい場合があったので、それも載っけておきます。
詳細は参考にさせていただいたページを参照ください。

MainActivity.kt
class MainActivity : FragmentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.viewpager_main)

        //fragmentリストを作成
        val fragmentList : MutableList<Fragment> = arrayListOf()
        fragmentList.add(SampleFragment1())
        fragmentList.add(SampleFragment2())

        //adapterのインスタンス生成
        val adapter = CustomPagerAdapter(supportFragmentManager, fragmentList)
        viewPager.adapter = adapter

        /* 下記が追加部分 */
        viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
            override fun onPageSelected(position: Int) {}
            override fun onPageScrollStateChanged(state: Int) {}
            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
        })

    }
}

参考
[kotlin] ViewPagerでフラグメントを切り替える
[kotlin] ViewPagerをボタンで切り替える
ViewPagerの基本

最後に

基本は理解できた!
ただ生成されているフラグメントの更新ができず(フラグメントは3枚まで保持している)、別の方法にシフトしました。
ViewPager2なら簡単にできるのかな~調べてみます。

また、間違っている部分やアドバイスありましたらお願いします。

3
2
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
3
2