#はじめに
以前にもViewPagerで画面をスワイプさせるアプリを作ったが(その時はJavaで)、どういう処理だったのか全然思い出せなかった。。。
参考にさせていただいた記事と似たり寄ったりですが、忘れないよう自分なりに記事にします。
#フラグメント
ViewPagerで表示するFragment。
onCreateViewで表示するレイアウトを作成する。
※SampleFragment1のみ載せます。同じようにFragmentクラスを作成すればOK!
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を継承して作成する。
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のみの単純なレイアウト。
共通して表示したいレイアウトがある場合、追加する。
<?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レイアウトのアダプターにセットする。
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
}
}
以上!!!
あと、ページスワイプ時に処理がしたい場合があったので、それも載っけておきます。
詳細は参考にさせていただいたページを参照ください。
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なら簡単にできるのかな~調べてみます。
また、間違っている部分やアドバイスありましたらお願いします。