我有3个底部导航选项卡,称为Home, Dashboard, Profile
。
- 在
Home
中我有Fragment1
和Fragment2
- 在
Dashboard
中,我有Fragment3
和Fragment4
- 在
Profile
中,我有MyProfile
和EditProfile
现在,在Fragment2
中,按钮changeAvatar
可以打开堆栈Profile
中的EditProfile
。因为EditProfile
应该在选项卡Profile
中,所以如果我不想将EditProfile
包括在Home
的navGraph
中,我如何实现这种行为?
您正在寻找的是所谓的全局操作。
假设您有以下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>
注意actionProfile
:中的action
部分
<action
android:id="@+id/navigateToEditProfile"
app:destination="@id/editProfileFragment" />
以上是您正在寻找的实际全局操作。
因此,要使流处于透视状态,您需要执行以下操作,从Fragment2
changeAvatar按钮进行导航。
fun navigateToChangeAvatar() {
changeAvatar.setOnClickListener { view ->
view.findNavController().navigate(R.id.navigateToEditProfile)
}
}
尝试使用深度链接
导航图。
<navigation
...>
<fragment
android:id="@+id/editProfileFragment"
>
...
<deepLink
android:id="@+id/deepLink"
app:uri="yourapp://edit/prfile" />
...
</fragment>
</navigation>
在片段中。
findNavController().navigate(Uri.parse("yourapp://edit/prfile"))
为了从后堆栈中获取片段,您必须这样声明您的操作
<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" />
要从Home>Fragment2导航到Profile>EditProfile,可以使用Navigation
按编辑类型传递id。
碎片2kt
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
)
}
}
EditProfileFragment.kt
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
}
}
}
编辑配置文件VM.kt
val editTypeId = MutableLiveData<String>()
fun setEditTypeId(id: editTypeId ) {...}
res/navigation/root_navigation.xml
<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>
编辑类型.kt
enum class EditType(val id: String) {
EDIT_PROFILE("EDIT_PROFILE"), EDIT_PROFILE_AVATAR("EDIT_PROFILE_AVATAR");
}
注意:导航的参数不能是Enum 类型
GL-