[英]How to switch to other fragment in different back stack using Navigation Component?
I have 3 bottom navigation tabs called Home, Dashboard, Profile
.我有 3 个底部导航选项卡,分别称为
Home, Dashboard, Profile
。
Home
, I have Fragment1
and Fragment2
,Home
,我有Fragment1
和Fragment2
,Dashboard
, I have Fragment3
and Fragment4
Dashboard
中,我有Fragment3
和Fragment4
Profile
, I have MyProfile
and EditProfile
.Profile
中,我有MyProfile
和EditProfile
。 Now, in Fragment2
, a button changeAvatar
can open EditProfile
in stack Profile
.现在,在
Fragment2
中,一个按钮changeAvatar
可以打开堆栈Profile
中的EditProfile
。 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?因为
EditProfile
应该在选项卡Profile
中,所以如果我不想将EditProfile
包含到Home
的navGraph
中,我该如何实现这种行为?
What you are looking for is known as global action .您正在寻找的是全球行动。
Given you have the following nav_graph
structure:鉴于您具有以下
nav_graph
结构:
<?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
:注意
actionProfile
中的action
部分:
<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.因此,要将流程透视,您将执行以下操作以从
Fragment2
changeAvatar 按钮导航。
fun navigateToChangeAvatar() {
changeAvatar.setOnClickListener { view ->
view.findNavController().navigate(R.id.navigateToEditProfile)
}
}
try with the deep link尝试使用深层链接
Navigation graph.导航图。
<navigation
...>
<fragment
android:id="@+id/editProfileFragment"
>
...
<deepLink
android:id="@+id/deepLink"
app:uri="yourapp://edit/prfile" />
...
</fragment>
</navigation>
In Fragment.在片段中。
findNavController().navigate(Uri.parse("yourapp://edit/prfile"))
You have to declare your action like this for getting a fragment from your back stack您必须像这样声明您的操作才能从您的后台堆栈中获取一个片段
<action
android:id="@+id/yourActionName"
app:destination="@id/editProfileFragment" />
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"
app:popUpTo="@+id/editProfileFragment" />
To navigate from Home > Fragment2 to Profile > EditProfile you can pass an id by edit type using Navigation
.要从Home > Fragment2导航到Profile > EditProfile ,您可以使用
Navigation
按编辑类型传递 id。
private fun navigateToEditProfileAvatar() {
buttonEditProfileAvatar.setOnClickListener { button ->
Navigation.findNavController(button).navigate(
R.id.action_global_to_edit_profile,
RootNavigationDirections.actionGlobalToEditProfile(
editType = EditType.EDIT_PROFILE_AVATAR.id
).arguments
)
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
...
viewModel.setEditTypeId(EditProfileFragmentArgs.fromBundle(arguments ?: Bundle()).editType)
}
private fun bind() {
when (viewModel.editTypeId) {
EditType.EDIT_PROFILE.id -> { ... }
EditType.EDIT_PROFILE_AVATAR.id -> {
// here
}
}
}
val editTypeId = MutableLiveData<String>()
fun setEditTypeId(id: editTypeId ) {...}
<action
android:id="@+id/action_global_to_edit_profile"
app:destination="@id/edit_profile_fragment" />
<fragment
android:id="@+id/edit_profile_fragment"
android:name="EditProfileFragment"
android:label=" "
tools:layout="@layout/fragment_edit_profile">
<argument
android:name="editType"
app:argType="string"
android:defaultValue="@string/edit_profile"
/>
</fragment>
enum class EditType(val id: String) {
EDIT_PROFILE("EDIT_PROFILE"), EDIT_PROFILE_AVATAR("EDIT_PROFILE_AVATAR");
}
Note : The arguments of a navigation cannot be of type Enum注意:导航的 arguments 不能是 Enum 类型
GL总帐
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.