android - 从 Viewpager2 片段访问父片段函数
问题描述
我正在使用导航组件,并且在我的主片段中有一个 ViewPager2。我们知道 viewPager2 也包含 Fragment。如何通过viewpager2的片段调用父函数?我尝试了一些方法,比如在构造函数中传递函数,但我实现了使用单例模式创建的片段。我只知道如何在构造函数中传递函数,比如标准类(不是单例类)
我的适配器
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}"
}
})
}
}
}
解决方案
您永远不应该将 a传递FragmentActivity
给您的FragmentStateAdapter
when Fragment
——这就是为什么有一个FragmentStateAdapter
构造函数需要 a的原因Fragment
。只有该Fragment
构造函数将片段正确嵌套ViewPager2
在父片段中。
一旦使用了正确的构造函数,您SliderImageFragment
就可以调用requireParentFragment()
并将其转换为DetailFragment
并调用您的方法。
推荐阅读
- c# - 使用 moq 模拟使用异步回调的方法
- flutter - 如何使容器可滚动?
- eclipse - RAM 中的 ARM Eclipse 调试代码。是否可以看到源代码`
- windows - Windows 上的 PyTorch 扩展 - 为什么无法解析符号(THFloatTensor 等)?
- json - Grep 在应用正则表达式之前忽略特殊字符
- svn - 显示警告提交后挂钩失败(退出代码 255),没有输出
- terraform - 通过地形变量并行实例?
- azure - 如何在 Azure 中实现多个应用服务的高可用性
- r - windows中Rscript进程的图片名称
- javascript - Django - 如何正确地将列表从模板发送到 AJAX 以查看?