Обновление метки NavDestination во время выполнения
Я не могу обновить ярлык NavDestination во время выполнения. он отражает, но не с первого раза, когда я выхожу на экран, он не отражается мгновенно
Моя ViewModel
class PrepareOrderDetailsViewModel(
brief: MarketHistoryResponse,
private val ordersRepository: OrdersRepository
) : BaseViewModel() {
private val _briefLiveData = MutableLiveData(brief)
val orderIdLiveData: LiveData<Int?> =
Transformations.distinctUntilChanged(Transformations.map(_briefLiveData) { it.id })
}
Наблюдение LiveData во фрагменте
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
registerObservers()
}
private fun registerObservers() {
viewModel.orderIdLiveData.observe(viewLifecycleOwner, Observer {
findNavController().currentDestination?.label = getString(R.string.prepare_order_details_title, it)
})
}
2 ответа
В соответствии с документацией Navigation UI, методы NavigationUI, такие как setupActionBarWithNavController()
метод полагаться на OnDestinationChangedListener
, который вызывается каждый раз, когда вы navigate()
в новое место назначения. Вот почему метка не изменяется мгновенно - она обновляется только при переходе к новому месту назначения.
Документация объясняет это для верхней панели приложения:
метка, которую вы прикрепляете к адресату, может автоматически заполняться из аргументов, предоставленных адресату, используя формат
{argName}
в вашем лейбле.
Это позволяет вам обновить ваш R.string.prepare_order_details_title
быть в форме
<string name="prepare_order_details_title">Prepare order {orderId}</string>
Используя тот же аргумент в пункте назначения, ваш заголовок будет автоматически заполнен правильной информацией.
Конечно, если у вас нет аргумента, который вы могли бы определить заранее, тогда вы бы не хотели устанавливать android:label
на вашем месте назначения и вместо этого вручную обновите заголовок панели действий и т. д. с этого места назначения.
Я нашел способ обойти эту проблему, открыв SupportActionBar
сам и установить заголовок от имени лейбла
private fun registerObservers() {
viewModel.orderIdLiveData.observe(viewLifecycleOwner, Observer {
(activity as AppCompatActivity).supportActionBar?.title =
getString(R.string.prepare_order_details_title, it)
})
}