С двумя фрагментами на одном экране (действие), как один фрагмент может обновлять другой с помощью EventBus

#android #android-fragments #kotlin #greenrobot-eventbus

#Android #android-фрагменты #kotlin #greenrobot-eventbus

Вопрос:

Хорошо, итак, я новичок в разработке Android.

Я создаю приложение для записи. На том же экране, что и кнопка записи (для записи вещей) У меня также есть Fragment , чтобы показать, сколько записей у меня есть. Я могу нажать кнопку записи, чтобы сделать запись, но количество записей не обновляется до тех пор, пока не будет обновлено состояние действия. Я хочу, чтобы количество записей обновлялось в режиме реального времени. Фрагмент будет виден и в другом действии, поэтому логика не может быть в основном действии записи.

Я только что интегрировал EventBus в свой проект. Я настроил его так, чтобы событие было успешной записью, а подписчиком пока является фрагмент.

Значение фрагмента правильно получает сообщение о событии, но фрагмент не будет обновляться до тех пор, пока он не будет «обновлен» или, скорее, не пройдет свой жизненный цикл от onDestroyView() до onCreateView() .

Пожалуйста, помогите, я хочу иметь возможность обновлять фрагмент в режиме реального времени без необходимости использовать встроенные функции жизненного цикла.

Спасибо!

Редактировать:

Я нашел решение, просто удалив фрагмент, а затем повторно добавив его.

 
                supportFragmentManager
                    .beginTransaction()
                    .remove(statsFragmentTwo)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
                    .commit()


                supportFragmentManager
                    .beginTransaction()
                    .add(R.id.main_stats_container_two, statsFragmentTwo)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .commit()

  

Но все же это выглядит не очень эффективным! Есть ли менее дорогостоящий способ?

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

1. Вы должны использовать общую ViewModel, которая предоставляет общие данные как LiveData, см. codelabs.developers.google.com/codelabs/android-lifecycles/#5

Ответ №1:

Значение фрагмента правильно получает сообщение о событии, но фрагмент не будет обновляться до тех пор, пока он не будет «обновлен» или, скорее, не пройдет свой жизненный цикл от onDestroyView () до onCreateView ().

Я не понимаю идею — « Fragment не будет обновляться». Если вы смогли успешно прослушать событие, вы можете немедленно обновить элементы пользовательского интерфейса, где вы перехватываете событие в своем фрагменте. Я просто создаю псевдокод.

 if(eventListened) 
    updateUIElementsHere();
  

Вам не нужно ждать вызова функций жизненного цикла. В вашей updateUIElementsHere функции вы могли бы рассмотреть возможность использования аналогичного кода, который есть в вашей onCreateView функции.

Надеюсь, это поможет!

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

1. Спасибо! Я обнаружил, что могу просто поместить код, который находится в onCreateView, в метод класса subscriber.

2. Приятно знать, что вы нашли проблему. 🙂