用官方文档的 Navigation 组件 有个明显的问题,Fragment 不会自动缓存,如果 Fragment 里有网络请求,有列表,切换后会自动销毁,无法保留状态,这是最基本的需求了吧?搜了一下,似乎讨论的不多,解决方案小白看着太难懂
Viewpager2 则自动缓存,但感觉 Viewpager2 正经不是干这个的
所以 2022 实现经典底部 Tab 切换,最佳实践是什么? 如果是 Navigation ,如何解决缓存的问题呢
1
ikas 2022-03-13 23:17:32 +08:00 1
Navigation 你要想缓存 Fragment 可以重写 FragmentNavigator,覆盖 navigate 方法,使用 show 与 hide..
但是这会产生各种额外问题,我自己的 app 使用这种方案,做了很多修改..始终不完善.. 实际 Fragment 中应该仅仅是 ui 与一些事件转发方法,你的逻辑与数据应该在 ViewModel 中,这样即使重建 Fragment 消耗也没有那么大,官方也是这样推荐的 Viewpager2 采用 RecyclerView 与 Fragment 来实现,不太适合做页面根框架,否则后续你的各种页面都要自己处理 |
2
liveoppo 2022-03-13 23:23:07 +08:00
我没理解错的话,需要本地缓存数据的话其结构是 view/fragment<--->view model<--->repository ,网络请求经常放在 repository 里面。fragment 页面滑动时 view mode 及 repository 不会消失和重建。
|
3
john6lq 2022-03-13 23:23:36 +08:00
ViewPager2 、Navigation 都能做,问题在于 Fragment 里做网络请求,这是绝对不允许的,至少从我看来。
按照开发规范,Activity 、Fragment 只能显示 UI ,持久化、网络请求移到 ViewModel 中。 ViewPager2 、Navigation 对 Fragment 生命周期的影响这个需要自己动手实践下。 |
4
james2013 2022-03-14 00:13:23 +08:00 via Android
navigation 用于复杂的页面,问题太多了
|
6
wobuhuicode 2022-03-14 09:11:29 +08:00
经典 tab 布局我记得以前做是用用 FragmentManager 来管理的,生成一个 FragmentTransaction ,创建的时候 add 进去,展示的时候 show 和 hide 。
|
7
yawenimy122 2022-03-14 09:16:19 +08:00
建议:不要用 Navigation ,太他妈麻烦了,坑又多
|
8
nicevar 2022-03-14 10:34:34 +08:00
这两个东西又是 Android 发展过程自己不断挖坑又填坑的经典案例,ViewPager 搞不下去了又来个 ViewPage2 ,这个 ViewPager2 扩展性极差,做手机应用问题不是太大,如果做 TV 的就没法用,至于那个 Navigation 是突然想起来要抄袭 iOS 了吗,做得不伦不类,这两个现在情况就是这些东西用起来不香,自己做一套又麻烦,干脆就不用。
|
9
secretman 2022-03-14 11:21:50 +08:00
viewpager2 还是 Navigation 都不要用,实际商业 App ,可能 Activity tab 嵌套 Fragment ,然后 Fragment 里面继续嵌套多个子 Fragment ,这两个新的不过是挖新坑罢了,老的 ViewPager 用用问题还少点。
|
10
lisongeee 2022-03-14 11:22:55 +08:00
可以尝试 navigation-compose ,android 旧的那套 findViewById/databinding/viewbinding 总感觉数据和 ui 没有彻底分离,还是得手动操作 view
|
12
chrisia 2022-03-14 12:00:27 +08:00
我已经 compose 了
|
13
debuggeeker 2022-03-14 14:27:39 +08:00
哪有最佳实践,得看 UI 长什么样
|
14
kldd529 2022-03-14 17:13:40 +08:00
两年前我用 Navigation 练手,差点没吐血,现在不知道怎么样了,还是建议 viewpager2
|
15
ikas 2022-03-14 17:42:49 +08:00
@Helsing ViewModel 同样可以定制啊.并且这个也很容易..
我自己就是直接给到了 app 级别,加上 ui 缓存,页面速度要快很多 |
16
zhanlanhuizhang 2022-03-22 09:21:48 +08:00
Navigation 有坑,需要重写 FragmentNavigator 。网上有开源代码。然后自己修改修改。但是上 TAB 和下 TAB 结合那是真的复杂,如果还要加上各个页面根据位置,判断状态栏颜色。写到吐血。
|
17
magicls 2022-03-22 17:01:03 +08:00
如果不需要支持左右滑动切换,直接 Tablayout ,上面放一 FragmentContainer ,手动切 Fragment 就行,甚至不用 viewpager2
|