【问题标题】:Responding to ViewPager2 Fragments Events in Activity响应Activity中的ViewPager2 Fragments事件
【发布时间】: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)
    }

}

谢谢!

【问题讨论】:

    标签: android kotlin android-fragments android-tablayout android-viewpager2


    【解决方案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()
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      相关资源
      最近更新 更多