Search code examples
androidkotlinandroid-fragmentsandroid-tablayoutandroid-viewpager2

Responding to ViewPager2 Fragments Events in Activity


I have a main activity that contains a ViewPager2 and a TabLayout to house a few fragments. Each fragment will have buttons that I want to trigger actions in the main activity. However, I'm not seeing how to set up the buttons/event handlers so that the main activity is notified whenever a button is pressed inside one of the fragments. Thanks!

MenuActivity.kt - ViewPager2/TabLayout Setup

private fun configureMenu() {
        // Create adapter
        val fragmentAdapter = PageAdapter(supportFragmentManager, lifecycle)
        // Add fragments
        fragmentAdapter.addFragment(CameraFragment(), getString(R.string.camera_tab))
        fragmentAdapter.addFragment(DevicesFragment(), getString(R.string.devices_tab))
        fragmentAdapter.addFragment(ConnectionFragment(), getString(R.string.connection_tab))
        // Set up pageviewer
        viewpager_menu.adapter = fragmentAdapter
        TabLayoutMediator(tablayout_main, viewpager_menu) { tab, position ->
            tab.text = fragmentAdapter.getPageTitle(position)
            viewpager_menu.setCurrentItem(tab.position, true)
        }.attach()
}

PageAdapter.kt

class PageAdapter(fm: FragmentManager, lifecycle: Lifecycle): FragmentStateAdapter(fm, lifecycle) {

    private var fragmentList = ArrayList<Fragment>()
    private var fragmentTitleList = ArrayList<String>()

    fun addFragment(fragment: Fragment, title: String) {
        fragmentList.add(fragment)
        fragmentTitleList.add(title)
    }

    override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
        super.onAttachedToRecyclerView(recyclerView)
    }

    override fun getItemCount(): Int {
        return fragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return fragmentList[position]
    }

    fun getPageTitle(position: Int): String {
        return fragmentTitleList[position]
    }
}

CameraFragment.kt


class CameraFragment : Fragment() {

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

}

Thanks!


Solution

  • Inside actions of the fragment

    val main = this.activity!! as MainActivity
    main.callSomeFunc()