我无法在运行时更新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)
})
}
答案 0 :(得分:0)
我通过访问SupportActionBar
本身来解决该问题,并代表标签设置标题
private fun registerObservers() {
viewModel.orderIdLiveData.observe(viewLifecycleOwner, Observer {
(activity as AppCompatActivity).supportActionBar?.title =
getString(R.string.prepare_order_details_title, it)
})
}
答案 1 :(得分:0)
根据Navigation UI documentation,NavigationUI方法(例如setupActionBarWithNavController()
方法)依赖于OnDestinationChangedListener
,每次您navigate()
到新目的地时都会调用该方法。这就是为什么标签不会立即更改的原因-仅在导航到新目的地时才会更新。
文档确实针对the top app bar进行了说明:
通过使用标签中的
{argName}
格式,可以自动从提供给目标的参数中填充附加到目标的标签。
这使您可以将R.string.prepare_order_details_title
更新为
<string name="prepare_order_details_title">Prepare order {orderId}</string>
通过在目的地上使用相同的argument,您的标题将自动填充正确的信息。
当然,如果您没有可以提前确定的参数,那么您将希望完全避免在目标位置设置android:label
,而是手动更新操作栏的标题,等等。