Динамический заголовок ActionBar из фрагмента с использованием навигации AndroidX
Я использую новый навигация компонент из Android Jetpack.
настройка корневой активности довольно проста:
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val navController = findNavController(R.id.navigationFragment)
    setupActionBarWithNavController(navController)
    bottomNavigationView.setupWithNavController(navController)
  }
Он хорошо работает, когда заголовок фрагмента определен в навигационном графике. Но для одного фрагмента я хочу установить заголовок динамически.
Я пытался с findNavController().currentDestination.label = "Hello world" но он ничего не делает.
Я мог бы, конечно, использовать трюк, как (activity as? AppCompatActivity)?.supportActionBar?.title = "Hello world", но я чувствую, что это сломает магию, что setupActionBarWithNavController() делает для меня. Это есть способ динамически обновлять заголовок панели действий? 
4 ответов
на данный момент компоненты архитектуры навигации Jetpack не предоставляют никакого "встроенного" способа сделать это, и вам придется реализовать свой собственный "пользовательский" метод для этого.
существует запрос функции для получения функциональных возможностей для динамических меток в назначениях, добавленных в новые компоненты архитектуры навигации Jetpack. Если вы здесь, потому что хотите/нуждаетесь в этой функции, пожалуйста, запустите существующий запрос функции, здесь: https://issuetracker.google.com/issues/80267266
до вопрос будет исправлено, простой слушатель работает со мной:
/**
 * Temporary solution to dynamically change title of actionbar controlled by Navigation component
 * Should be removed as soon as the bug on Navigation will be fixed: (https://issuetracker.google.com/issues/80267266)
 */
interface TempToolbarTitleListener {
    fun updateTitle(title: String)
}
class MainActivity : AppCompatActivity(), TempToolbarTitleListener {
    ...
    override fun updateTitle(title: String) {
        binding.toolbar.title = title
    }
}
изменить заголовок фрагмента:
(activity as TempToolbarTitleListener).updateTitle("custom title")
вы можете добавить addOnNavigatedListener внутри вашей деятельности, и на основе текущего назначения изменить название
 findNavController(nav_host_fragment).addOnNavigatedListener { controller, destination ->
        when(destination.id) {
            R.id.destination1 -> {
                my_toolbar.title= "Some title"
            }
            R.id.destination2 -> {
                my_toolbar.title= "Othertitle"
            }
    }
}
другое решение-использовать ViewModel и LiveData, прикрепить viewmodel к вашей активности и фрагментам, добавить поле livedata внутри viewmodel
val title = MutableLiveData<String>()
из вашей деятельности соблюдайте это поле, и если оно изменено, обновите заголовок панели инструментов
viewModel?.title?.observe(this, Observer { 
        my_toolbar.title=it
    })
из нужного фрагмента измените поле заголовка внутри viewmodel
viewModel?.title?.value="New title"
