и т. д. Это то, что я имел в виду, я предполагал, что ваши имена являются заполнителями.

навигационный компонент JetPack выглядит довольно многообещающе, я попал в то место, где я не смог найти способ реализовать то, что хотел.

Давайте посмотрим на пример экрана приложения:

В приложении есть одно основное действие: верхняя панель инструментов и нижняя панель инструментов с прикрепленным потрясающим значком. Есть 2 проблемы, с которыми я сталкиваюсь, и я хочу сделать их правильно.

1. Мне нужно реализовать транзакции фрагментов, чтобы разрешить замену фрагмента на экране в зависимости от взаимодействия с пользователем. Есть три способа, которыми я могу придумать и реализовать это:

способ обратного вызова. Наличие интерфейсаonFragmentAction обратный вызов во фрагменте и есть активность, чтобы реализовать его. Так что в основном, когда пользователь нажимает кнопку вFragmentA я могу позвонитьonFragmentAction с параметрами, так что действие будет запускаться и запускать, например, транзакцию, чтобы заменить ееFragmentBвоплощать в жизньNavigation компонент от JetPack. Несмотря на то, что я попробовал это и, кажется, довольно просто, у меня была проблема из-за невозможности получить текущий фрагмент.Используйте общийViewModel между фрагментом и активностью, обновите его из фрагмента и наблюдайте за ним в активности. Это было бы "заменой" обратных вызовов

2. ПосколькуFAB находится в родительской активности, при нажатии мне нужно иметь возможность взаимодействовать с текущим видимым фрагментом и выполнять действие. Например, добавьте новый элемент в представление переработчика внутри фрагмента. Таким образом, в основном способ общения между деятельностью и фрагментом Есть два способа, которыми я могу думать о том, как сделать это

Если не использоватьNavigation тогда я могу использоватьfindFragmentById и получить текущий фрагмент и запустить открытый метод для запуска действия.Используя общий ViewMode между фрагментом и действием, обновите его из действия и наблюдайте за фрагментом.

Итак, как вы можете видеть, рекомендуемый способ сделать навигацию - использовать новый компонент архитектуры «Навигация», однако в настоящий момент у него нет способа извлечь текущий экземпляр фрагмента, поэтому я не знаю, как связаться между активность и фрагмент. Это может быть достигнуто сshared ViewModel но здесь у меня пропущена часть: я понимаю, что связь между фрагментами может быть сделана с помощью общей ViewModel. Я думаю, что это имеет смысл, когда у фрагментов есть что-то общее для этого, например сценарий Master / Detail и совместное использование одной и той же модели представления очень полезно.

Но тогда разговор между деятельностью иВСЕ фрагменты, как мог поделилсяViewModel использоваться? Каждый фрагмент нуждается в своем собственном сложном ViewModel. Может ли это бытьGeneralViewModel который создается в действии и во всех фрагментах вместе с обычной моделью представления фрагмента, поэтому в каждом фрагменте есть 2 модели представления.

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

Любая информация с удовольствием получена.

Позже отредактируйте. Вот пример кода, основанный на комментариях ниже. Это решение для моего вопроса? Может ли это обрабатывать изменения между фрагментами и родительской активностью, и это на рекомендуемой стороне.

 private GlobalViewModel ():ViewModel(){

      var eventFromActivity:MutableLiveData<Event>
      var eventFromFragment:MutableLiveData<Event>


      fun setEventFromActivity(event:Event){
          eventFromActivity.value = event
      }

      fun setEventFromFragment(event:Event){
          eventFromFragment.value = event
      }

 } 

Тогда в моей деятельности

class HomeActivity: AppCompatActivity(){

   onCreate{
       viewModel = ViewModelProviders.of(this, factory)
                .get(GlobalViewModel::class.java)

        viewModel.eventsFromFragment.observe(){
           //based on the Event values, could update toolbar title, could start
           // new fragment, could show a dialog or snackbar
        ....
        }   

     //when need to update the fragment do 
     viewModel.setEventFromActivity(event)
   }
}

Тогда во всех фрагментах есть что-то подобное

class FragmentA:Fragment(){

  onViewCreated(){

       viewModel = ViewModelProviders.of(this, factory)
                .get(GlobalViewModel::class.java)

        viewModel.eventsFromActivity.observe(){
           // based on Event value, trigger a fun from the fragment 
        ....
        }

        viewModelFragment = ViewModelProviders.of(this, factory)
            .get(FragmentAViewModel::class.java)

        viewModelFragment.some.observe(){
        ....
        }   

  //when need to update the activity do 
     viewModel.setEventFromFragment(event)      
  }

}

Ответы на вопрос(0)

Ваш ответ на вопрос