与 viewpager 内的片段的父片段通信

Posted

技术标签:

【中文标题】与 viewpager 内的片段的父片段通信【英文标题】:Parent Fragment communication with fragment inside viewpager 【发布时间】:2021-12-11 12:08:45 【问题描述】: 我有一个 MainActivity 和 -> FragmentA 包含 -> ViewPager 和 (Fragment1,Fragment2,Fragment3) 现在在FragmentA 我有一个微调器,任何选择都必须反映viewpager当前可见片段内的变化。 我怎样才能做到这一点?我现在不想遵循ViewModelEventBus 方法,因为我正在处理非常古老的项目。我想使用接口在它们之间进行通信。

【问题讨论】:

【参考方案1】:

在您的FragmentA 中创建一个interface

interface OnSpinnerValue
    fun onSpinnerValueChanged()

为当前选中的fragment创建一个WeakReference

private var _currentPage: WeakReference<OnSpinnerValue>? = null
private val currentPage
    get() = _currentPage?.get()

fun setCurrentPage(page: OnSpinnerValue) 
    _currentPage = WeakReference(page)

现在在 ViewPager 的每个孩子 fragment 中实现这个 interface

class Fragment1() : Fragment(), OnAddEvent 
    override fun onSpinnerValueChanged() 
         // implement your method
    

并且,根据选择的片段更新FragmentAcurrentPage值,并在每个子fragmentonResume()中更新它

override fun onResume() 
    super.onResume()
    (parentFragment as FragmentA).setCurrentPage(this)

现在,从微调器的 onItemSelected 方法中触发 onSpinnerValueChanged

override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) 
     currentPage?.onSpinnerValueChanged()

【讨论】:

为什么我们在这里使用 Wea​​kReference? 这样就不会导致内存泄漏。【参考方案2】:

如果你不想使用 ViewModel 很奇怪, 我知道这可能不是最好的解决方案,但你可以:

    您可以在片段中创建函数 itIsYourFunctionToUpdate() 并在 FragmentA() 上更新他,使用她的对象调用函数,例如 fragmentB.itIsYourFunctionToUpdate()
if (ViewPager.getCurrentItem() == 0 && page != null) 
          ((FragmentClass1)page).itIsYourFunctionToUpdate("new item");     
     
    您也可以像这样mAdapter.notifyDataSetChanged() 更新viewPager,并且必须更新viewPager 中的所有片段

【讨论】:

以上是关于与 viewpager 内的片段的父片段通信的主要内容,如果未能解决你的问题,请参考以下文章

检测片段内的 ViewPager 选项卡更改

检测片段内的 ViewPager 选项卡更改

将视图粘贴在协调器布局内的 viewpager 片段的底部

ViewPager 中片段内的 ScrollView 内的 Horizo​​ntalListView

带有边距和页面转换器的片段内的 ViewPager 无法正确呈现

如何确定 Fragment 何时在 ViewPager 中可见