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