设置
我使用导航组件/图形进行了过渡(从 RIGHT 滑入),创建了Master Detail Fragment。转到详细信息页面时,它可以完美工作,但返回到母版页面时,我无法解决。
期望
我想要与activity?.onBackPressed()
类似的过渡行为,即主片段从 LEFT 插入。
现在您可能会说我可以改用onBackPressed
,但又有另一个问题迫使我使用navController.navigate
api。
原因:当按下 Save 按钮时,详细信息片段将Bundle
传递回Master,但是当我遇到 >使用onBackPressed
取消按钮,因此我转而使用navController.navigate
而不传递任何Bundle
。
也许有不同的解决方案,任何横向思考都值得赞赏。
观察
我使用Navigation Component进行了观察,看来Master Fragment从未被销毁,Detail碎片的确确实在背面被销毁了,但是Master碎片仍保留在内存中。任何见解将不胜感激。
okListener = View.OnClickListener {
navController.navigate(R.id.action_detail_to_master, bundleOf("user" to user)) // with bundle
}
cancelListener = View.OnClickListener {
navController.navigate(R.id.action_detail_to_master) // no bundle
}
nav_graph.xml (我尝试反转输入/退出转换,但它具有奇怪的转换行为)
<fragment
android:id="@+id/master"
android:name="package.Master"
android:label="Master">
<action
android:id="@+id/action_master_to_detail" app:destination="@id/detail"
app:popEnterAnim="@anim/slide_in_left" app:popExitAnim="@anim/slide_out_right"
app:enterAnim="@anim/slide_in_right" app:exitAnim="@anim/slide_out_left" />
<argument
android:name="user"
app:argType="package.User" />
</fragment>
<fragment
android:id="@+id/detail"
android:name="package.Detail"
android:label="Detail">
<argument
android:name="user"
app:argType="package.User" />
<action android:id="@+id/action_detail_to_master" app:destination="@id/master"
app:popEnterAnim="@anim/slide_out_right" app:popExitAnim="@anim/slide_in_left"
app:enterAnim="@anim/slide_out_left" app:exitAnim="@anim/slide_in_right" />
</fragment>
使用此answer,我能够解决一半的问题(过渡)。基本上,我必须使用app:popUpTo
属性,但是参数问题仍然存在。
<fragment
android:id="@+id/master"
android:name="package.Master"
android:label="Master">
<action
android:id="@+id/action_detail_to_master"
app:popUpTo="@id/master" />
</fragment>
问题
navController.navigate(R.id.action_detail_to_master, bundleOf("user" to user))
无法在Master中阅读
override fun onStart() {
super.onStart()
Log.d("UserList", "onStart: ")
arguments?.getParcelable<User>("user")?.let {
Log.d("Master", "onStart: data was passed back")
//recyclerView.adapter?.notifyDataSetChanged()
}
}