Issue
I am actually not sure, how the correct way or the best practice to set different toolbar using navigation controller component
in my app. I want to set 2 different toolbars.
- green toolbar
- red toolbar
two toolbars with different colour. this is just to simplify the case, actually I have multiple toolbars
I am using navigation controller component. and currently on my Main Activity as the host, I set the green toolbar in my main activity using this code
setSupportActionBar(green_toolbar)
supportActionBar?.setDisplayShowTitleEnabled(false)
// set up top hierarchy destination
val appBarConfiguration = AppBarConfiguration(setOf(
R.id.destination_home,
R.id.destination_search,
R.id.destination_user_control,
R.id.destination_create_event)
)
green_toolbar.setupWithNavController(navController,appBarConfiguration)
so what is the best way to set different toolbar using navigation controller component ?
do I have to make those 2 different toolbars in my main activity? or do I have to set fragmentY destination(that has red toolbar) as another activity not as the fragment ?
or.... I don't know....please help :)
Solution
The answer below is for an app that use Bottom Navigation View, if you are using Navigation Drawer then use this anwer
so according the documentation from here , I need to set the toolbar in each fragment.
If, however, your top app bar changes substantially across destinations, then consider removing the top app bar from your activity and defining it in each destination fragment, instead.
so we will add the toolbar in each fragment instead of set it in MainActivity. if you set toolbar in each fragment, it also will make it possible to implement Collapsing Toolbar.
say for example in your bottom navigation menu you have home, profile and search fragments as top level fragment (root) like this
so in EACH top level fragment set the toolbar using this code in onViewCreated
of your fragment.
val toolbar = view.findViewById<androidx.appcompat.widget.Toolbar>(R.id.toolbarInYourFragment)
val appBarConfiguration = AppBarConfiguration(setOf(
R.id.destination_home,
R.id.destination_profile // set all your top level destinations in here
R.id.destination_search)
)
val navHostFragment = NavHostFragment.findNavController(this);
NavigationUI.setupWithNavController(toolbar, navHostFragment,appBarConfiguration)
you have to pass appBarConfiguration
to remove back button in your toolbar. so you have to pass appBarConfiguration
in each top level fragment (home,search,profile), not only in your home.
and for the rest of the fragments you don't need to pass appBarConfiguration
, so for the rest of your fragments just pass this code in onViewCreated
.
val toolbar = view.findViewById<androidx.appcompat.widget.Toolbar>(R.id.toolbarInYourFragment)
val navHostFragment = NavHostFragment.findNavController(this);
NavigationUI.setupWithNavController(toolbar, navHostFragment)
and if your toolbar has menu, then add this code:
setHasOptionsMenu(true)
(activity as AppCompatActivity).setSupportActionBar(toolbar)
toolbar.setNavigationOnClickListener { view ->
view.findNavController().navigateUp()
}
to use AppBarConfiguration
class , in gradle app you need to use navigation-ui-ktx
artifact and you need to add compile options and kotlin options like this
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}
dependencies {
def nav_version = "2.3.0-alpha04"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}
don't forget to add noActionBar in your res value style xml
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
Answered By - Alexa289
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.