【问题标题】:One-Single Activity or Two Activities一项活动或两项活动
【发布时间】:2023-04-01 20:10:02
【问题描述】:

我的应用程序的主要Activity(包含一个NavigationDrawer)允许在许多(大约20 个)Fragments 中导航,因为每个片段内都有 navDrawer 项目点击和其他视图的点击。

然后,它移动到我需要 BottomNavigationView 的位置(还维护 navDrawer)。从这一点开始,由于 bottomNavView 和其他视图的点击,我可以移动到其他不同的 10-15 片段,aprox,以及主 NavigationDrawer 允许的片段,但是,如果我通过点击移动到片段在任何主 navDrawer 的项目上,bottomNavView 应该被隐藏。

那么,在这里使用 One-Single Activity 方法并控制 bottomNavView 的可见性是否正确,或者我应该使用两个 Activity 以避免在所有导航中都被挂起?

【问题讨论】:

    标签: android android-fragments android-activity navigation-drawer android-navigation


    【解决方案1】:

    我认为在这种情况下没有“正确或错误”的答案。

    这真的归结为您希望如何构建您的应用程序,只要您保持一致。

    如果您的片段具有“状态”和 ViewMOdel 等,那么在控制自己的状态(何时显示底栏)的同时交换片段的单个活动可能比必须维护两个不同的活动更简单,因为导航是总是在片段之间完成。

    它还将与每种情况下的后台堆栈的行为方式相关联(因此进行相应测试以确保您获得预期的行为)。

    简单的想法(一个动作)

    这是伪代码,不完美,编译,功能代码。

    class BottomBarUseCase() {
       operator fun invoke(destination: String): Boolean =
           when (destination) {
              "A", "B", "C" -> true
              else -> false
           }
    }
    

    您的 Activity 的 ViewModel(当然大大简化了)

    class XXXViewModel(
       private val bottomBarUseCase: BottomBarUseCase
    ): ViewModel() {
    
        private val _state = MutableLiveData<YourState>(YourState.Empty)
    
        fun setupBottomBar(destination: String) {
           if (bottomBarUseCase(destination)) {
               _state.value = SomeState.ShowBar
           } else {
               _state.value = SomeState.HideBar
           }
        }
    

    你的 Activity 观察状态并做它需要做的事情。

    有一些方法可以简化这一点,但本质上,您将展示栏的责任委托给用例,您可以单独对其进行测试以确保它完成您希望它做的事情(又名:不显示某些目的地的栏)。

    您的 Fragments 不关心这些(除非他们也需要做出决定,在这种情况下,您仍然可以在 Fragment 的 viewModels 中注入 useCase 并在那里询问,因为 useCase 没有任何特殊依赖)。

    这就是我会做的,但在现实生活中不必这样做,很难想象这是否会有其他缺点。

    一般来说,我会这样处理一个需要在很多地方解决的问题:隔离它。

    希望澄清一下。

    【讨论】:

    • 您的意思是控制每个 Fragment 中的状态或仅控制 Activity 中的状态(保持底部导航视图可见性)
    • 我会有一个“用例”,它根据目的地决定是否显示栏。 “单一”活动将调用用例/委托来做出决定并采取相应的行动。
    • 谢谢,抱歉回复晚了。问题是我不知道如何通知有关当前显示的片段的活动,我的意思是,一旦我导航到将启用栏可见性的片段,那么除了片段本身之外,如何通知活动?谁调用 setupBottomBar?谢谢
    • 当您导航到 X 时,有人知道这一点。这种“状态”是活动在做出决定时也会咨询的内容。有人(不是活动,不是片段)必须知道(并保持)这些知识。当您点击目的地 X 时,活动将收到一个事件,帮助它(或直接告诉它)决定如何处理该栏。你的问题是useCase 的被调用者如何知道要通过哪个目的地。好吧,您可以(在活动 ViewModel 中?)跟踪这一点。请记住您将事件转发到 ViewModel 并接收回事件...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多