Динамический заголовок 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"