Android 开发新手,经典底部 Tab 切换 2022 最佳实践是用 viewpager2 还是 Navigation 组件?

2022-03-13 22:03:36 +08:00
 wuhaoworld

用官方文档的 Navigation 组件 有个明显的问题,Fragment 不会自动缓存,如果 Fragment 里有网络请求,有列表,切换后会自动销毁,无法保留状态,这是最基本的需求了吧?搜了一下,似乎讨论的不多,解决方案小白看着太难懂

Viewpager2 则自动缓存,但感觉 Viewpager2 正经不是干这个的

所以 2022 实现经典底部 Tab 切换,最佳实践是什么? 如果是 Navigation ,如何解决缓存的问题呢

11001 次点击
所在节点    Android
17 条回复
ikas
2022-03-13 23:17:32 +08:00
Navigation 你要想缓存 Fragment 可以重写 FragmentNavigator,覆盖 navigate 方法,使用 show 与 hide..
但是这会产生各种额外问题,我自己的 app 使用这种方案,做了很多修改..始终不完善..

实际 Fragment 中应该仅仅是 ui 与一些事件转发方法,你的逻辑与数据应该在 ViewModel 中,这样即使重建 Fragment 消耗也没有那么大,官方也是这样推荐的

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/840085

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX