响应Activity中的ViewPager2 Fragments事件

Posted

技术标签:

【中文标题】响应Activity中的ViewPager2 Fragments事件【英文标题】:Responding to ViewPager2 Fragments Events in Activity 【发布时间】:2021-09-19 01:12:00 【问题描述】:

我有一个包含 ViewPager2 和 TabLayout 的主要活动来容纳一些片段。每个片段都有我想在主要活动中触发动作的按钮。但是,我没有看到如何设置按钮/事件处理程序,以便在其中一个片段内按下按钮时通知主要活动。谢谢!

MenuActivity.kt - ViewPager2/TabLayout 设置

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)
    


谢谢!

【问题讨论】:

【参考方案1】:

片段的内部动作

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

【讨论】:

自我是什么?返回片段中的错误 但必须在onViewCreated 中,因此片段知道该布局【参考方案2】:

你可以在特定的frament构造函数中传递activity的this对象,并使用from fragment来调用activity类的方法

例如:

 class MenuActivity : AppCompatActivity()
    fragmentAdapter.addFragment(CameraFragment(this), getString(R.string.camera_tab))



  class CameraFragment : Fragment 
        var mActivity: MenuActivity? = null
        constructor(mActivity: MenuActivity?) 
            this.mActivity = mActivity
        

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

【讨论】:

以上是关于响应Activity中的ViewPager2 Fragments事件的主要内容,如果未能解决你的问题,请参考以下文章

从 Viewpager2 片段访问父片段函数

ViewPager2+Fragment

YuLook-解决ViewPager2滑动灵敏问题

RecyclerView扩展(一)ViewPager2使用与原理浅析

Android.16.ViewPager2+Fragment

我可以让 Fragment 等待来自 Activity 的数据吗?