JetpackMvvm
JetpackMvvm copied to clipboard
重要更新:关于使用了navigation且升级到1.2.3以后的版本
在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" />
作者大大,关于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()
}
}
从A->B->C,最后从C->A是不是有问题 博主
会创建出新的Fragment 用popBackStack指定到fragment失效
你popBackStack 是如何配置的
<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)
nav().popBackStack(R.id.action_CFrgment_to_AFragment,true) 用的它的这个方法 貌似有bug
你按照我上面的那种写法去试试吧,代码调用popBackStack 我还没有这么写过
666 nav().navigateAction(R.id.action_CFrgment_to_AFragment) 试了下这个方法有效 嗯
老哥,请问navigation+BottomNavigationView支持滑动切换页面吗?就像ViewPager2一样
老哥,话说我在FragmentContainerView中使用你的NavHostFragmentHideShow出了bug,不知道是不是页面重复缓存了😢
https://user-images.githubusercontent.com/54784104/146944981-a23f20b9-ce70-42b7-b502-138a099d9194.mp4
老哥,话说我在FragmentContainerView中使用你的NavHostFragmentHideShow出了bug,不知道是不是页面重复缓存了😢
搞了一个晚上加半个上午终于弄好了,使用FragmentContainerView时需要使用自定义的NavHostFragment还有navGraph,navGraph的标签要用自定义FragmentNavigator的注解,还有在activity中不能使用~~bottomNavigationView.setupWithNavController~~方法,要用
bottomNavigationView.setOnItemSelectedListener {
navHostFragment.navController.navigate(it.itemId)
return@setOnItemSelectedListener true
}
坑是真的多,走了很多弯路,但是用过之后就感觉就没那么难了🤔在这感谢自定义FragmentNavigator解决Navigation重复创建的问题还有何老哥自定义的FragmentNavigator和NavHostFragment了😉
@zhushenwudi 你的问题最近我在看项目出现过,官方有文档可以解决这个问题,这个应该跟fragment栈内复用有关,你可以使用官网《嵌套导航图》这个栏目 把重复的fragment多放在嵌套图里边,这样可以解决你的问题 https://developer.android.google.cn/guide/navigation/navigation-nested-graphs