【Android】画面コンポーネント / ViewPager

 ■ はじめに

https://dk521123.hatenablog.com/entry/2013/09/26/010117

で画面遷移について扱ったが、今回は、左から右へのスワイプで
画面遷移できるようにするやり方のひとつに ViewPagerってのがある。

また、iPhoneのように、ListViewでスワイプしたら、
削除ボタンが表示したかったので
調べてみたら、以下のサイトが見つかった。

http://yusuke-hata.hatenablog.com/entry/2014/01/16/021853

ViewPager を使うらしいので、手始めにViewPager の簡単なサンプルを作成してみる。

追記:ViewPager2

ViewPager2 ってのもあるので、それは、関連記事を参照のこと。

画面コンポーネント / ViewPager
https://dk521123.hatenablog.com/entry/2019/09/30/020307

■ 作成手順

* ViewPager / ViewPager2 どちらでも基本は同じで以下の通り。

1)Fragmentを追加・実装する
2)Activityに ViewPager を追加する
 ⇒ その際に、id を設定する
3)Adapterを実装する
4)2)のActivityを実装する

■ サンプル

例1:Hello World

1)Fragmentを追加・実装する 
 => 以下「QuestionFragment.kt」「AnswerFragment.kt」を参照

2)ActivityにViewPagerを追加する
~~~~~
* activity_main.xml から ViewPagerを追加する
 ⇒ id を「pager」にする
~~~~~

3)FragmentPagerAdapterを実装する
 => 以下「PagerAdapter.kt」を参照

4)2)のActivityを実装する
 => 以下「MainActivity.kt」を参照

QuestionFragment.kt

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

class QuestionFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_question, container, false)
    }
}

AnswerFragment.kt

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

class AnswerFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_answer, container, false)
    }
}

PagerAdapter.kt

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter

class PagerAdapter(fragmentManager: FragmentManager, private var fragments: ArrayList<Fragment>) : FragmentPagerAdapter(fragmentManager) {

    init {
        getItem(0)
    }

    override fun getItem(position: Int): Fragment? {
        return fragments[position]
    }

    override fun getCount(): Int {
        return fragments.size
    }
}

MainActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.fragment.app.FragmentManager
import androidx.viewpager.widget.ViewPager

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // ★追加★
        val fragments = arrayListOf(QuestionFragment(), AnswerFragment())
        val fragmentManager: FragmentManager = supportFragmentManager
        val adapter = PagerAdapter(fragmentManager = fragmentManager, fragments = fragments)
        val pager = this.findViewById<ViewPager>(R.id.pager)
        pager.adapter = adapter
    }
}

例2:例1の別解

MainActivity.kt (「viewPage」を追加)

import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v4.view.ViewPager
import android.support.v7.app.AppCompatActivity

import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.content_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        this.initializeViewPager(viewPager)
    }

    private fun initializeViewPager(pager: ViewPager?) {
        val adapter = SampleAdapter(this.supportFragmentManager)

        val fragment1 = BlankFragment.newInstance("This is a First Fragment!")
        adapter.addFragment(fragment1, "TAB 1")

        val fragment2 = BlankFragment.newInstance("This is a Second Fragment!!")
        adapter.addFragment(fragment2, "TAB 2")

        val fragment3 = BlankFragment.newInstance("This is a Third Fragment!!!")
        adapter.addFragment(fragment3, "TAB 3")

        pager?.adapter = adapter
    }
}

SampleAdapter.kt (アダプターが必要なので、Kotlin の クラスを追加)

import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentPagerAdapter

class SampleAdapter (manager: FragmentManager) : FragmentPagerAdapter(manager) {
    private val fragments = ArrayList<Fragment>()
    private val titles = ArrayList<String>()
    
    override fun getItem(position: Int): Fragment = fragments.get(position)

    override fun getCount(): Int = fragments.size

    override fun getPageTitle(position: Int): CharSequence? = titles.get(position)

    fun addFragment(fragment: Fragment, title: String) {
        this.fragments.add(fragment)
        this.titles.add(title)
    }
}

BlankFragment.kt

//   [app]を右クリックして、[New]-[Fragment]-[Fragment (Black)]を選択。
// 「textView」を配置。 
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import kotlinx.android.synthetic.main.fragment_blank.view.*

class BlankFragment : Fragment() {
    private var text = ""

    companion object {
        @JvmStatic
        fun newInstance(text: String): BlankFragment {
            val fragment = BlankFragment()
            val bundle = Bundle()
            bundle.putString("Text", text)
            fragment.arguments = bundle
            return fragment
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        this.text = arguments?.get("Text").toString()
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_blank, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        view.textView.setText(text)
    }
}

参考文献

https://shoheohtani.blogspot.com/2019/02/kotlin-fragment-viewpager.html
https://marketable-skill.biz/?p=860
https://qiita.com/shanonim/items/4bf31a203cc90d73aae8
https://v4all123.blogspot.com/2017/12/simple-example-of-using-viewpager-in.html

関連記事

画面コンポーネント / ViewPager2 ~ スワイプして 画面遷移 をするには ~
https://dk521123.hatenablog.com/entry/2019/09/30/020307
画面コンポーネント / ListView ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2013/10/10/005010
画面コンポーネント / ListView ~ Realm データを表示 ~
https://dk521123.hatenablog.com/entry/2018/09/02/130212