单项 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 不有任何特殊的依赖关系)。
这就是我会做的,但如果在现实生活中不必这样做,很难想象这是否会有其他缺点。
一般来说,这就是我处理需要在许多地方其他地方解决的问题的方式:隔离它。
希望澄清一下。
我的应用程序的主要 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 不有任何特殊的依赖关系)。
这就是我会做的,但如果在现实生活中不必这样做,很难想象这是否会有其他缺点。
一般来说,这就是我处理需要在许多地方其他地方解决的问题的方式:隔离它。
希望澄清一下。