与导航组件来回过渡,以获取主要细节片段

时间:2020-08-28 10:59:47

标签: android kotlin android-architecture-components android-jetpack android-architecture-navigation

设置

我使用导航组件/图形进行了过渡(从 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()
    }
}

0 个答案:

没有答案
相关问题