与 viewpager 内的片段的父片段通信
Posted
技术标签:
【中文标题】与 viewpager 内的片段的父片段通信【英文标题】:Parent Fragment communication with fragment inside viewpager 【发布时间】:2021-12-11 12:08:45 【问题描述】: 我有一个MainActivity
和 -> FragmentA
包含 -> ViewPager
和 (Fragment1,Fragment2,Fragment3
)
现在在FragmentA
我有一个微调器,任何选择都必须反映viewpager当前可见片段内的变化。
我怎样才能做到这一点?我现在不想遵循ViewModel
或EventBus
方法,因为我正在处理非常古老的项目。我想使用接口在它们之间进行通信。
【问题讨论】:
【参考方案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
并且,根据选择的片段更新FragmentA
的currentPage
值,并在每个子fragment
的onResume()
中更新它
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()
【讨论】:
为什么我们在这里使用 WeakReference? 这样就不会导致内存泄漏。【参考方案2】:如果你不想使用 ViewModel 很奇怪, 我知道这可能不是最好的解决方案,但你可以:
-
您可以在片段中创建函数 itIsYourFunctionToUpdate() 并在
FragmentA()
上更新他,使用她的对象调用函数,例如 fragmentB.itIsYourFunctionToUpdate()
或
if (ViewPager.getCurrentItem() == 0 && page != null) ((FragmentClass1)page).itIsYourFunctionToUpdate("new item");
-
您也可以像这样
mAdapter.notifyDataSetChanged()
更新viewPager,并且必须更新viewPager 中的所有片段
【讨论】:
以上是关于与 viewpager 内的片段的父片段通信的主要内容,如果未能解决你的问题,请参考以下文章
ViewPager 中片段内的 ScrollView 内的 HorizontalListView