2

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

 2 years ago
source link: https://www.v2ex.com/t/840085
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Android

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

  wuhaoworld · 22 小时 15 分钟前 · 1100 次点击

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

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

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

15 条回复    2022-03-14 17:42:49 +08:00

ikas

ikas      21 小时 1 分钟前   ❤️ 1

Navigation 你要想缓存 Fragment 可以重写 FragmentNavigator,覆盖 navigate 方法,使用 show 与 hide..
但是这会产生各种额外问题,我自己的 app 使用这种方案,做了很多修改..始终不完善..

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

Viewpager2 采用 RecyclerView 与 Fragment 来实现,不太适合做页面根框架,否则后续你的各种页面都要自己处理

liveoppo

liveoppo      20 小时 55 分钟前

我没理解错的话,需要本地缓存数据的话其结构是 view/fragment<--->view model<--->repository ,网络请求经常放在 repository 里面。fragment 页面滑动时 view mode 及 repository 不会消失和重建。

john6lq

john6lq      20 小时 55 分钟前

ViewPager2 、Navigation 都能做,问题在于 Fragment 里做网络请求,这是绝对不允许的,至少从我看来。
按照开发规范,Activity 、Fragment 只能显示 UI ,持久化、网络请求移到 ViewModel 中。
ViewPager2 、Navigation 对 Fragment 生命周期的影响这个需要自己动手实践下。

james2013

james2013      20 小时 5 分钟前 via Android

navigation 用于复杂的页面,问题太多了

Helsing

Helsing      11 小时 46 分钟前 via iPhone

@ikas #1 那所有的 ViewModel 都要是 Activity 生命周期的,其实也不合理

wobuhuicode

wobuhuicode      11 小时 7 分钟前

经典 tab 布局我记得以前做是用用 FragmentManager 来管理的,生成一个 FragmentTransaction ,创建的时候 add 进去,展示的时候 show 和 hide 。

yawenimy122

yawenimy122      11 小时 2 分钟前

建议:不要用 Navigation ,太他妈麻烦了,坑又多

nicevar

nicevar      9 小时 44 分钟前

这两个东西又是 Android 发展过程自己不断挖坑又填坑的经典案例,ViewPager 搞不下去了又来个 ViewPage2 ,这个 ViewPager2 扩展性极差,做手机应用问题不是太大,如果做 TV 的就没法用,至于那个 Navigation 是突然想起来要抄袭 iOS 了吗,做得不伦不类,这两个现在情况就是这些东西用起来不香,自己做一套又麻烦,干脆就不用。

secretman

secretman      8 小时 57 分钟前

viewpager2 还是 Navigation 都不要用,实际商业 App ,可能 Activity tab 嵌套 Fragment ,然后 Fragment 里面继续嵌套多个子 Fragment ,这两个新的不过是挖新坑罢了,老的 ViewPager 用用问题还少点。

lisongeee

lisongeee      8 小时 56 分钟前

可以尝试 navigation-compose ,android 旧的那套 findViewById/databinding/viewbinding 总感觉数据和 ui 没有彻底分离,还是得手动操作 view

rosu

rosu      8 小时 41 分钟前 via iPhone

@Helsing 这就是楼主的需求。缓存肯定存在内存里。

chrisia

chrisia      8 小时 18 分钟前

我已经 compose 了

debuggeeker

debuggeeker      5 小时 51 分钟前

哪有最佳实践,得看 UI 长什么样

kldd529

kldd529      3 小时 5 分钟前

两年前我用 Navigation 练手,差点没吐血,现在不知道怎么样了,还是建议 viewpager2

ikas

ikas      2 小时 36 分钟前

@Helsing ViewModel 同样可以定制啊.并且这个也很容易..
我自己就是直接给到了 app 级别,加上 ui 缓存,页面速度要快很多

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK