在运行时更新NavDestination标签

时间:2019-05-18 15:07:29

标签: android android-jetpack android-jetpack-navigation

我无法在运行时更新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 个答案:

答案 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,而是手动更新操作栏的标题,等等。