Связь родительского фрагмента с фрагментом внутри видового экрана

#android #android-fragments #android-viewpager

Вопрос:

  • У меня есть один MainActivity с -gt; gt; FragmentA , который содержит -gt; gt; ViewPager с ( Fragment1,Fragment2,Fragment3 )
  • Теперь у FragmentA меня есть один счетчик, и любой выбор должен отражать изменения внутри видимого в данный момент фрагмента viewpager.
  • Как я могу этого достичь? Я пока не хочу следовать ViewModel или EventBus подходить, так как работаю над очень старым проектом. Я хочу использовать интерфейс для связи между ними.

Ответ №1:

Создайте interface внутри себя FragmentA

 interface OnSpinnerValue{  fun onSpinnerValueChanged() }  

Создайте WeakReference для текущего выбранного fragment

 private var _currentPage: WeakReferencelt;OnSpinnerValuegt;? = null private val currentPage  get() = _currentPage?.get()  fun setCurrentPage(page: OnSpinnerValue) {  _currentPage = WeakReference(page) }  

Теперь внедрите это interface в каждого ребенка fragment из ViewPager

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

И обновите currentPage значение в FragmentA соответствии с выбранным фрагментом и обновите его в onResume() каждом дочернем элементе fragment

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

Теперь запускайте onSpinnerValueChanged из onItemSelected методов вашего спиннера

 override fun onItemSelected(parent: AdapterViewlt;*gt;?, view: View?, position: Int, id: Long) {  currentPage?.onSpinnerValueChanged() }  

Комментарии:

1. Почему мы используем здесь слабую связь?

2. Чтобы это не привело к утечке памяти.

Ответ №2:

Странно , если вы не хотите использовать ViewModel, я знаю, может быть, это не лучшее решение, но вы можете :

  1. вы можете создать функцию itIsYourFunctionToUpdate() внутри вашего фрагмента и обновить его FragmentA() , вызвав функцию с ее объектом, например fragmentB.itIsYourFunctionToUpdate() или
 if (ViewPager.getCurrentItem() == 0 amp;amp; page != null) {  ((FragmentClass1)page).itIsYourFunctionToUpdate("new item");   }  
  1. Также вы можете обновить ViewPager таким mAdapter.notifyDataSetChanged() образом, и весь фрагмент внутри ViewPager должен быть обновлен