一项活动或两项活动

Posted

技术标签:

【中文标题】一项活动或两项活动【英文标题】:One-Single Activity or Two Activities 【发布时间】:2021-10-15 15:42:27 【问题描述】:

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

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

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

【问题讨论】:

【参考方案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 并接收回事件...

以上是关于一项活动或两项活动的主要内容,如果未能解决你的问题,请参考以下文章

简练软考知识点整理-排列活动顺序

在android中进行两项活动[重复]

将值从一项活动更新到另一项活动

如何将当前位置从一项活动发送到另一项活动?

如何将图像从一项活动发送到另一项活动?

java 将一项活动的数据发送到另一项活动