0

我无法在运行时更新 NavDestination 的标签。它会反射,但不是从我第一次进入屏幕时开始,它不会立即反射

我的视图模型

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)
        })
    }
4

2 回答 2

1

根据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在您的目的地设置一个,而是从该目的地手动更新您的操作栏的标题等。

于 2019-05-18T16:20:46.053 回答
0

我通过访问SupportActionBar自身并代表标签设置标题来解决该问题

    private fun registerObservers() {
        viewModel.orderIdLiveData.observe(viewLifecycleOwner, Observer {
            (activity as AppCompatActivity).supportActionBar?.title =
                getString(R.string.prepare_order_details_title, it)

        })
    }
于 2019-05-18T15:33:31.887 回答