#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, я знаю, может быть, это не лучшее решение, но вы можете :
- вы можете создать функцию itIsYourFunctionToUpdate() внутри вашего фрагмента и обновить его
FragmentA()
, вызвав функцию с ее объектом, напримерfragmentB.itIsYourFunctionToUpdate()
или
if (ViewPager.getCurrentItem() == 0 amp;amp; page != null) { ((FragmentClass1)page).itIsYourFunctionToUpdate("new item"); }
- Также вы можете обновить ViewPager таким
mAdapter.notifyDataSetChanged()
образом, и весь фрагмент внутри ViewPager должен быть обновлен