Доступ к родительской функции фрагмента из фрагмента Viewpager2

Я использую компонент навигации, и внутри моего домашнего фрагмента есть ViewPager2. Мы знали, что viewPager2 тоже содержит Fragment. Как вызвать родительскую функцию через фрагмент viewpager2? Я попробовал какой-то метод, например передачу функции в конструкторе, но я понял, что фрагмент создан в одноэлементном режиме. Я знаю только, как передавать функции в конструктор, например стандартный класс (не класс Singleton)

Мой адаптер

class DetailSliderAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {

    private val images = mutableListOf<String>()

    fun addImages(lsImage: List<String>){
        images.addAll(lsImage)
        notifyDataSetChanged()
    }

    override fun getItemCount(): Int = images.size
    override fun createFragment(position: Int): Fragment {
        return SliderImageFragment.newInstance(images[position])
    }

    class SliderImageFragment: Fragment(){
        companion object{
            const val EXTRA_SLIDER_IMAGE = "extra_slider_image"
            fun newInstance(imageStr: String) = SliderImageFragment().apply {
                this.arguments = Bundle().apply {
                    this.putString(EXTRA_SLIDER_IMAGE, imageStr)
                }
            }

        }

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

        override fun onActivityCreated(savedInstanceState: Bundle?) {
            super.onActivityCreated(savedInstanceState)

            val image = arguments?.getString(EXTRA_SLIDER_IMAGE) as? String

            image?.let {
                Picasso.get()
                    .load(image)
                    .into(image_slide)

                image_slide.setOnClickListener {
                    
                    // here i want to call parent's Fragment  function
              
            }
        }
    }
}

Главная страница моего фрагмента

class DetailFragment : Fragment() {
    private var root: View ?= null
    private var viewpagerSlider : ViewPager2 ?= null

    private val viewModel : DetailViewModel by lazy {
        ViewModelProviders.of(this, factory).get(DetailViewModel::class.java)
    }

    private val adapterSlider : DetailSliderAdapter by lazy {
        DetailSliderAdapter(requireActivity()){
            //listener
        }
    }

    fun clearAllAdapter(){
        // NEED TO CALL THIS
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val safeArgs : DetailFragmentArgs by navArgs<DetailFragmentArgs>()
        idProduct = safeArgs.idProduct
        Timber.d("ID PRODUCT $idProduct")

        if(root == null){
            root = inflater.inflate(R.layout.fragment_detail, container, false)
            idProduct?.let {
                viewModel.getDetail(idProduct!!)
            }
        }
        return root
    }


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        Timber.d("CALL onViewCreated")

        viewModel.getDataDetail().observe(viewLifecycleOwner, Observer {
            when(it.status){
                
                Response.ResponseStatus.LOADED -> {
                    progress_circular.visibility = View.GONE
                    val data = it.data
                    data?.let { d->
                        val detailProduct = d.detailProduct
                        detailProduct?.let { pd->
                            updateUI(pd, data)
                        }

                    }
                }
               
            }

        })
    }

    private fun updateUI(pd: ProductDetail, data: Data) {
        pd.image?.let {
            updateSliderPhoto(pd.image)
        }
    }

    private fun updateSliderPhoto(
        image: List<String>
    ) {
        viewpagerSlider = root?.findViewById(R.id.slider_photo)
        adapterSlider.addImages(image)

        viewpagerSlider?.apply {
            this.adapter = adapterSlider
            this.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback(){
                override fun onPageSelected(position: Int) {
                    super.onPageSelected(position)
                    page_indicator.text = "${(position+1)}/${image.size}"
                }
            })
        }
    }

}

person Nanda Z    schedule 31.12.2020    source источник


Ответы (1)


Вы не должны никогда передавать FragmentActivity вашему FragmentStateAdapter, когда находитесь в Fragment, поэтому существует конструктор FragmentStateAdapter, который принимает Fragment. Только этот конструктор Fragment правильно вкладывает фрагменты ViewPager2 в ваш родительский фрагмент.

После использования правильного конструктора ваш SliderImageFragment может вызвать requireParentFragment() и привести его к DetailFragment и вызвать ваш метод.

person ianhanniballake    schedule 31.12.2020
comment
наконец, это работает, я изменил фрагментактивность с помощью текущего фрагмента. Спасибо, сэр - person Nanda Z; 31.12.2020