Обновление метки NavDestination во время выполнения - PullRequest
0 голосов
/ 18 мая 2019

Я не могу обновить ярлык 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 голосов
/ 18 мая 2019

Согласно документации UI , методы NavigationUI, такие как метод setupActionBarWithNavController(), основаны на OnDestinationChangedListener, который вызывается каждый раз, когда вы navigate() вызываете новый пункт назначения. Вот почему метка не изменяется мгновенно - она ​​обновляется только при переходе к новому месту назначения.

Документация объясняет, что для верхняя панель приложения :

метка, которую вы прикрепляете к адресату, может автоматически заполняться из аргументов, предоставленных адресату, используя формат {argName} в вашей метке.

Это позволяет вам обновить ваш R.string.prepare_order_details_title в виде

<string name="prepare_order_details_title">Prepare order {orderId}</string>

Используя тот же аргумент в пункте назначения, ваш заголовок будет автоматически заполнен правильной информацией.

Конечно, если у вас нет аргумента, который вы могли бы определить заранее, тогда вы бы вообще не хотели устанавливать android:label в пункте назначения и вместо этого вручную обновлять заголовок панели действий и т. Д. из этого пункта назначения.

0 голосов
/ 18 мая 2019

Я нашел способ обойти эту проблему, обратившись к самому SupportActionBar и установив заголовок на имени пользователя

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

        })
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...