I have 3 bottom navigation tabs called Home, Dashboard, Profile
.
Home
, I have Fragment1
and Fragment2
,Dashboard
, I have Fragment3
and Fragment4
Profile
, I have MyProfile
and EditProfile
.Now, in Fragment2
, a button changeAvatar
can open EditProfile
in stack Profile
. Because EditProfile
should be in tab Profile
, so if I don't want to include EditProfile
into navGraph
of Home
, how can I achieve that behavior?
Use Up or Back button to go to a previous step of the order flow.
To pop destinations when navigating from one destination to another, add an app:popUpTo attribute to the associated <action> element. app:popUpTo tells the Navigation library to pop some destinations off of the back stack as part of the call to navigate() .
Calling addToBackStack() commits the transaction to the back stack. The user can later reverse the transaction and bring back the previous fragment by pressing the Back button. If you added or removed multiple fragments within a single transaction, all of those operations are undone when the back stack is popped.
What you are looking for is known as global action.
Given you have the following nav_graph
structure:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_nav_graph"
app:startDestination="@id/actionHome">
<navigation
android:id="@+id/actionHome"
android:label="Home"
app:startDestination="@id/fragment1">
<fragment
android:id="@+id/fragment1"
android:name="com.example.app.Fragment1"
android:label="Home Fragment 1"
tools:layout="@layout/fragment_1" />
<fragment
android:id="@+id/fragment2"
android:name="com.example.app.Fragment2"
android:label="Home Fragment 2"
tools:layout="@layout/fragment_2" />
</navigation>
<navigation
android:id="@+id/actionDashboard"
android:label="Dashboard"
app:startDestination="@id/fragment3">
<fragment
android:id="@+id/fragment3"
android:name="com.example.app.Fragment3"
android:label="Dashboard Fragment 3"
tools:layout="@layout/fragment_3" />
<fragment
android:id="@+id/fragment4"
android:name="com.example.app.Fragment4"
android:label="Dashboard Fragment 4"
tools:layout="@layout/fragment_4" />
</navigation>
<navigation
android:id="@+id/actionProfile"
android:label="Profile"
app:startDestination="@id/myProfileFragment">
<fragment
android:id="@+id/myProfileFragment"
android:name="com.example.app.MyProfileFragment"
android:label="My Profile"
tools:layout="@layout/fragment_my_profile"/>
<fragment
android:id="@+id/editProfileFragment"
android:name="com.example.app.EditProfileFragment"
android:label="Edit Profile"
tools:layout="@layout/fragment_edit_profile"/>
<action
android:id="@+id/navigateToEditProfile"
app:destination="@id/editProfileFragment" />
</navigation>
</navigation>
Note the action
section within actionProfile
:
<action
android:id="@+id/navigateToEditProfile"
app:destination="@id/editProfileFragment" />
The above is the actual global action that you are looking for.
So to put the flow into perspective you would do the following to navigate from Fragment2
changeAvatar button.
fun navigateToChangeAvatar() {
changeAvatar.setOnClickListener { view ->
view.findNavController().navigate(R.id.navigateToEditProfile)
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With