簡體   English   中英

片段與viewpager內的片段通信

[英]Fragment communication with fragment inside viewpager

  • 我有一個MainActivity with -> FragmentA其中包含 -> ViewPager with ( Fragment1,Fragment2,Fragment3 )
  • 現在在FragmentA我有一個微調器,任何選擇都必須反映viewpager當前可見片段內的更改。
  • 我怎樣才能做到這一點? 我現在不想遵循ViewModelEventBus方法,因為我正在處理非常古老的項目。 我想使用接口在它們之間進行通信。

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()
}

如果您不想使用 ViewModel ,這很奇怪,我知道這可能不是最佳解決方案,但您可以:

  1. 您可以在片段中創建函數 itIsYourFunctionToUpdate() 並在FragmentA()上更新他,使用她的對象調用函數,如fragmentB.itIsYourFunctionToUpdate()
if (ViewPager.getCurrentItem() == 0 && page != null) { ((FragmentClass1)page).itIsYourFunctionToUpdate("new item"); }
  1. 您也可以像這樣更新 viewPager mAdapter.notifyDataSetChanged()並且必須更新 viewPager 中的所有片段

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM