Android FragmentPagerAdapterにセットされたFragmentにアクセスする


例えばActivity側で定義されたActionBarやToolBarのUIで操作が行われた時、ViewPager側のFragmentを操作する必要がある時等に。

Activity側

FragmentPagerAdapter.getItem(position)でFragmentを取得すればよい。positionはViewPager.currentItemで取得できる。

val viewPager =  findViewById<ViewPager>(R.id.viewPager)
val mFragmentPagerAdapter =  object : FragmentPagerAdapter(supportFragmentManager){  ... 略 }
...
val i = viewPager.currentItem
//currentのfragmentを取得
val fragment = mFragmentPagerAdapter.getItem(i) as ViewPagerFragment
//fragmentにアクセス
fragment.doAction()
Fragment側

Fragment側はActivityから実行されるメソッドをインターフェースとしておけばアクセスインスタンスを抽象化できる

interface ViewPagerFragment {
    fun doAction()
}
Foo : Fragment(), ViewPagerFragment{
    override fun doAction(){}
}

ただし、FragmentPagerAdapter.getItem(position)で取得したFragmentの状態によって、メンバで保持してるインスタンス等破棄されているケースがある。特にlateinit var のメンバにアクセスしたりするとぬるぽになる時があるので注意しよう。