单项 Activity 或两项活动

One-Single Activity or Two Activities

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

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

那么,这里使用单一 Activity 方法并控制 bottomNavView 的可见性是否正确,或者我应该使用两个 Activity 以避免在所有导航中悬而未决?

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

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

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

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

简单的想法(一个动作)

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

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 不关心这些(除非他们也需要做出决定,在这种情况下你仍然可以在 Fragments 的 viewModels 中注入 useCase 并在那里询问,因为 useCase 不有任何特殊的依赖关系)。

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

一般来说,这就是我处理需要在许多地方其他地方解决的问题的方式:隔离它。

希望澄清一下。