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

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

例えば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 のメンバにアクセスしたりするとぬるぽになる時があるので注意しよう。