V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wuhaoworld
V2EX  ›  Android

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

  •  
  •   wuhaoworld · 2022-03-13 22:03:36 +08:00 · 10997 次点击
    这是一个创建于 1015 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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