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

一个 App 只有一个 MainActivity 牵扯到 Navigation 组件的问题

  •  
  •   defendhairline1 · 2020-04-01 09:56:51 +08:00 · 9136 次点击
    这是一个创建于 1701 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Google 推出架构组件之后,就很想把项目使用 MVVM 重构一波。其中 Navigation 组件是我打算实现单 Activity 架构的关键组件(这里指的不是一个 app 就一个 activity,而是只有一个 MainActivity,其他还有 LoginActivity,SplashActivity 等)。

    问题来了

    MainActivity 中有 NavHostFragment 和 BottomNavigationView 实现底部导航(假设有三个 tab),我想所有 Fragment 页面都在这个 NavHostFragment 中导航,但是遇到一个问题,就是 BottomNavigationView 一直都显示在底部,点击底部导航 tab,整个页面操作栈就乱了。

    我的做法

    从起始在首页的三个 fragment 导航到其他子 fragment 的时候,把 BottomNavigationView 隐藏,然后回到起始的 fragment 的时候再显示出来。
    但是我觉得这个方法有种说不出来的不合理。各位大佬有其他解决方法吗,请赐教~

    8 条回复    2020-04-01 16:30:00 +08:00
    hugedeffing
        1
    hugedeffing  
       2020-04-01 11:03:14 +08:00
    我也是用 navController.addOnDestinationChangedListener 判断当前 fragment,然后进行 bottom 显示隐藏……
    另外由于没有滑动切换 fragment,我还加了手势判断。

    我也等等看有没有其他方式……
    whyrookie
        2
    whyrookie  
       2020-04-01 11:25:52 +08:00
    插个楼,BottomNavigationView+Navigation 每次点击 tab 都会重新创建 fragment,挺难受的,感觉没有特别好的方案?楼主的问题我也感觉怪怪的,不是很合理,我个人喜欢,进到下一个模块使用单独的 Activity.
    qingmei2
        3
    qingmei2  
       2020-04-01 11:29:21 +08:00
    个人认为这种方式有点太极端了,我对其理解应该这样:

    MainActivity - MainFragment(这个才应该是 Destination) - ViewPager+BottomNavigationView - 3 个 SubFragment

    也就是说不将 SubFragment 视为 Destination 以及导航行为的发起者,页面间的导航都委托给 MainFragment,当其他页面返回 MainFragment 时,再将 result 事件分发给 SubFragment,这样从层级上来说会清晰非常多。

    说白了就是目前原生提供的 API 中对多栈支持力度还不太够,Google 官方已经不止一次提出 Fragment 即将迎来重要的重构,可以再等等。

    个人浅见,欢迎讨论。
    wuz
        4
    wuz  
       2020-04-01 13:17:04 +08:00
    单个 activity 多个 fragment 这种思路不太好,建议换一下
    wobuhuicode
        5
    wobuhuicode  
       2020-04-01 14:21:56 +08:00
    不明白这几年 谷歌那帮人在搞啥。以前的那套 MVP 就是乱七八糟的,现在的 MVVM 更加惨不忍睹。
    方向摇摆不定的。该补的没补。
    sankemao
        6
    sankemao  
       2020-04-01 15:24:40 +08:00
    我现在用的 3l 的思路,但是有个问题,如果你为 fragment 设置了进场出场动画,当布局复杂的时候就会卡顿
    defendhairline1
        7
    defendhairline1  
    OP
       2020-04-01 16:19:55 +08:00
    @wuz 想用单 Activity 的目的就是为了,方便管理应用内全局统一弹窗,统一网络监控,实现不需要任何权限的悬浮按钮等。但栈管理啥的确实不如 Activity 完善
    defendhairline1
        8
    defendhairline1  
    OP
       2020-04-01 16:30:00 +08:00
    @qingmei2 可以的,使用 MainFragment 作为 Start Destination 的思路很好 。 赞!感谢老哥
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1177 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:08 · PVG 07:08 · LAX 15:08 · JFK 18:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.