и т. д. Это то, что я имел в виду, я предполагал, что ваши имена являются заполнителями.
навигационный компонент 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)
}
}