JetpackMvvm icon indicating copy to clipboard operation
JetpackMvvm copied to clipboard

重要更新:关于使用了navigation且升级到1.2.3以后的版本

Open hegaojian opened this issue 2 years ago • 12 comments

在1.2.3之前的版本,使用navigation,虽然达到了切换fragment,不会销毁的作用,但是切换时生命周期不会走 onResume,onPause,而只能用 onHideChange方法去处理,这样的体验会不太友好,经过Alexxiaopang的建议,使用了新的方式替代.,从而达到了跟普通fragment一样的生命周期。从1.2.3版本前升级到1.2.3后需要修改name属性的配置,具体代码如下

<fragment
            android:id="@+id/host_fragment"
            android:name="me.hgj.jetpackmvvm.navigation.NavHostFragmentHideShow"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/main_navation" />

hegaojian avatar Jul 06 '21 02:07 hegaojian

作者大大,关于AFragment跳转到 BFragment A -> B -> A -> B

其中 第一次 A -> B 传了一个 true 的bundle,第二次 A -> B 传了一个 false 的 bundle,但是在 B 中的 onResume 回调的都是第一次的 true,值没有改变。

代码:

 <fragment
    android:id="@+id/AFragment"
    android:name="xxx.AFragment"
    android:label="AFragment">
    <action
        android:id="@+id/action_AFragment_to_BFragment"
        app:destination="@id/BFragment" />
</fragment>
<fragment
    android:id="@+id/BFragment"
    android:name="xxx.BFragment"
    android:label="BFragment">
    <action
        android:id="@+id/action_BFragment_to_AFragment"
        app:destination="@id/AFragment"/>
</fragment>

第一次 A -> B

val bundle = Bundle()
bundle.putBoolean("isUser", true)
navigate(R.id.action_AFragment_to_BFragment, bundle)

B -> A

navigate(R.id.action_BFragment_to_AFragment)

第二次 A -> B

val bundle = Bundle()
bundle.putBoolean("isUser", false)
navigate(R.id.action_AFragment_to_BFragment, bundle)

BFragment.kt:

override fun onResume() {
    super.onResume()
    arguments?.run {
        val a = getBoolean("isUser")
        "$a".loge()
    }
}

zhushenwudi avatar Jul 10 '21 08:07 zhushenwudi

从A->B->C,最后从C->A是不是有问题 博主

18810951092 avatar Jul 21 '21 10:07 18810951092

会创建出新的Fragment 用popBackStack指定到fragment失效

18810951092 avatar Jul 21 '21 10:07 18810951092

你popBackStack 是如何配置的

hegaojian avatar Jul 22 '21 01:07 hegaojian

 <action
            android:id="@+id/action_CFrgment_to_AFragment"
            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:popUpToInclusive="false"
            app:popUpTo="@id/Afragment" />

你C到A时可以这么调用 nav().navigateAction(R.id.action_CFrgment_to_AFragment)

hegaojian avatar Jul 22 '21 02:07 hegaojian

nav().popBackStack(R.id.action_CFrgment_to_AFragment,true) 用的它的这个方法 貌似有bug

18810951092 avatar Jul 22 '21 02:07 18810951092

你按照我上面的那种写法去试试吧,代码调用popBackStack 我还没有这么写过

hegaojian avatar Jul 22 '21 02:07 hegaojian

666 nav().navigateAction(R.id.action_CFrgment_to_AFragment) 试了下这个方法有效 嗯

18810951092 avatar Jul 22 '21 02:07 18810951092

老哥,请问navigation+BottomNavigationView支持滑动切换页面吗?就像ViewPager2一样

SaltedFish-Extreme avatar Dec 21 '21 13:12 SaltedFish-Extreme

老哥,话说我在FragmentContainerView中使用你的NavHostFragmentHideShow出了bug,不知道是不是页面重复缓存了😢

https://user-images.githubusercontent.com/54784104/146944981-a23f20b9-ce70-42b7-b502-138a099d9194.mp4

SaltedFish-Extreme avatar Dec 21 '21 14:12 SaltedFish-Extreme

老哥,话说我在FragmentContainerView中使用你的NavHostFragmentHideShow出了bug,不知道是不是页面重复缓存了😢

搞了一个晚上加半个上午终于弄好了,使用FragmentContainerView时需要使用自定义的NavHostFragment还有navGraphnavGraph的标签要用自定义FragmentNavigator的注解,还有在activity中不能使用~~bottomNavigationView.setupWithNavController~~方法,要用

bottomNavigationView.setOnItemSelectedListener {
            navHostFragment.navController.navigate(it.itemId)
            return@setOnItemSelectedListener true
        }

坑是真的多,走了很多弯路,但是用过之后就感觉就没那么难了🤔在这感谢自定义FragmentNavigator解决Navigation重复创建的问题还有何老哥自定义的FragmentNavigator和NavHostFragment了😉

SaltedFish-Extreme avatar Dec 22 '21 08:12 SaltedFish-Extreme

@zhushenwudi 你的问题最近我在看项目出现过,官方有文档可以解决这个问题,这个应该跟fragment栈内复用有关,你可以使用官网《嵌套导航图》这个栏目 把重复的fragment多放在嵌套图里边,这样可以解决你的问题 https://developer.android.google.cn/guide/navigation/navigation-nested-graphs

LYChunGit avatar Jun 02 '22 10:06 LYChunGit