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

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

  •  
  •   wuhaoworld · 107 天前 · 2555 次点击
    这是一个创建于 107 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    17 条回复    2022-03-22 17:01:03 +08:00
    ikas
        1
    ikas  
       107 天前   ❤️ 1
    Navigation 你要想缓存 Fragment 可以重写 FragmentNavigator,覆盖 navigate 方法,使用 show 与 hide..
    但是这会产生各种额外问题,我自己的 app 使用这种方案,做了很多修改..始终不完善..

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

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