【问题标题】:Get reference of viewPager2 from child fragment从子片段中获取 viewPager2 的引用
【发布时间】:2021-08-04 11:53:11
【问题描述】:

我有一个包含 ViewPager2 的片段,它有 3 个子片段,我想在子片段中接收一个参考查看器,以便能够以编程方式更改 viewPager。由于包含 viewPager 的父片段不是活动,因此我无法使用 findViewById 访问 viewPager。在另一个问题上,用户建议 val pager = container as ViewPager2 但它返回 null。有人可以帮我弄这个吗。如代码 sn-ps 所示,我试图从 OneFragment 获取对 BillingFragment 中 viewPager 的引用。

如果您需要查看ViewPagerAdapter 代码 sn-p,请告诉我。

子片段

class OneFragment : Fragment() {


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_billing, container, false)

        val pager = container as ViewPager2

         // ^^^^^ page is null

        return view;

    }

ViewPager 主片段

class BillingFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_billing_main, container, false)

        setupStepView(view)
        setupViewPager(view)
        setupButtons(view)

        return view
    }

    private fun setupStepView(view: View) {
        view.stepView.state
            // You should specify only stepsNumber or steps array of strings.
            // In case you specify both steps array is chosen.
            .steps(
                listOf(
                    "First Step",
                    "Second Step",
                    "Third Step"
                )
            ) // You should specify only steps number or steps array of strings.
            // In case you specify both steps array is chosen.
            .stepsNumber(3)
            .animationDuration(resources.getInteger(android.R.integer.config_shortAnimTime))
            .commit()

        view.stepView.setOnStepClickListener { position ->
            // viewPager.setCurrentItem(position, false)
        }

    }

    private fun setupViewPager(view: View) {
       // viewPager = view.viewPager;
        view.viewPager.adapter = ViewPagerAdapter(childFragmentManager, lifecycle)
        view.viewPager.registerOnPageChangeCallback(
            object : ViewPager2.OnPageChangeCallback() {

                override fun onPageSelected(position: Int) {
                    super.onPageSelected(position)
                    view.stepView.go(position, true)
                    setButtons(position, view)
                }

            }
        )

    }

    private fun setupButtons(view: View) {

        view.backButton.setOnClickListener {
            view.viewPager.setCurrentItem(view.viewPager.currentItem - 1, false)
        }

        view.nextButton.setOnClickListener {
            view.viewPager.setCurrentItem(view.viewPager.currentItem + 1, false)
        }

    }

    private fun setButtons(position: Int, view: View) {
        when (position) {
            0 -> {
                view.backButton.visibility = View.INVISIBLE
                view.nextButton.visibility = View.VISIBLE
            }
            1 -> {
                view.backButton.visibility = View.VISIBLE
                view.nextButton.visibility = View.VISIBLE
            }
            2 -> {
                view.backButton.visibility = View.VISIBLE
                view.nextButton.visibility = View.INVISIBLE
            }
        }
    }
}

【问题讨论】:

    标签: android kotlin android-viewpager android-viewpager2


    【解决方案1】:

    在父片段中访问子片段的视图不是一个好主意。如果你想从片段中触发任何动作。您可以按照以下步骤操作:

    class MyViewPagerAdapter(...) : FragmentStateAdapter(...){
       lsit : List<Fragment>
    
       fun getItem(position :Int) = list[position]
    }
    
    class OneFragment : Fragment(){
       override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            // Inflate the layout for this fragment
            val view = inflater.inflate(R.layout.fragment_billing, container, false)
    
            val position = viewPager2.currentItem
            (adapter.getItem(position) as? BillingFragment)?.
    
            return view;
    
        }
    }
    
    class BillingFragment : Fragment(){
      override fun onViewCreated(...){
        ...
      }
    
      // pass the data in the parameter that you want to use or update
      fun updateViewPager(position : Int){
         // perform your actions
         view.viewPager.currentItem = position
      }
    }
    

    替代品

    1. 如果你知道EventBus,那么你可以使用EventBus
    2. android默认使用BroadcastReceiver

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多