模块化单个 Activity Android 具有循环片段依赖性的应用程序
Modularize Single Activity Android Application with circular fragment dependencies
我们有一个带有底栏导航的应用程序。导航在我们的 MainActivity
中。我们使用片段管理应用程序不同屏幕之间的导航。例如。有:
- ProductFragment
- 登录片段
- CartFragment
- ProfileFragment
- 搜索片段
在我们的 MainActivity
中,我们有一个方法 pushFragment(Fragment fragment)
负责用新片段替换当前片段。在我们不同的片段之间有很多依赖关系。例如:
- 用户可以从
CartFragment
启动 ProductFragment
- 为了查看某些产品数据,用户必须登录 (
LoginFragment
)
LoginFragment
也用自ProfileFragment
- 通过"historic orders"在
ProfileFragment
您还可以通过ProductFragment
显示产品详情。
我们现在想要模块化我们的 Android 应用程序以利用即时应用程序、更快的构建时间和所有其他优势。理想情况下,我们希望每个片段都有一个模块。然而,由于像我刚才描述的那样的依赖关系,我们无法创建线性依赖关系层次结构,也不知道如何构建我们的模块。
每次我们尝试选择第一个模块从 app 模块中提取时,我们最终都会有很多依赖项,我们还必须移动到新模块。
我们目前看到的唯一解决方案是改变我们在片段之间导航的方式,但我们想不出如何做到这一点的方法。
我们找到了解决方案的开始:
我们有一个接口 NavigationHelper
,它声明了导航到其他片段的方法(startProfileFragment
、startLoginFragment
、startProductFragment
、...)。这个接口在我们的 libBase 中。它在应用程序模块中的 Activity 中实现。
在 Fragment 中,我们将 onAttach
中的 context
转换为 NavigationHelper
(同时检查上下文是否为 NavigationHelper,否则抛出异常):
private NavigationHelper mNavigationHelper;
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof NavigationHelper){
mNavigationHelper = (NavigationHelper) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement NavigationHelper");
}
}
然后调用mNavigationHelper.startProfileFragment()
切换Fragment即可。
感谢@Andrey 提醒我发布:)
我们有一个带有底栏导航的应用程序。导航在我们的 MainActivity
中。我们使用片段管理应用程序不同屏幕之间的导航。例如。有:
- ProductFragment
- 登录片段
- CartFragment
- ProfileFragment
- 搜索片段
在我们的 MainActivity
中,我们有一个方法 pushFragment(Fragment fragment)
负责用新片段替换当前片段。在我们不同的片段之间有很多依赖关系。例如:
- 用户可以从
CartFragment
启动 - 为了查看某些产品数据,用户必须登录 (
LoginFragment
) LoginFragment
也用自ProfileFragment
- 通过"historic orders"在
ProfileFragment
您还可以通过ProductFragment
显示产品详情。
ProductFragment
我们现在想要模块化我们的 Android 应用程序以利用即时应用程序、更快的构建时间和所有其他优势。理想情况下,我们希望每个片段都有一个模块。然而,由于像我刚才描述的那样的依赖关系,我们无法创建线性依赖关系层次结构,也不知道如何构建我们的模块。
每次我们尝试选择第一个模块从 app 模块中提取时,我们最终都会有很多依赖项,我们还必须移动到新模块。
我们目前看到的唯一解决方案是改变我们在片段之间导航的方式,但我们想不出如何做到这一点的方法。
我们找到了解决方案的开始:
我们有一个接口 NavigationHelper
,它声明了导航到其他片段的方法(startProfileFragment
、startLoginFragment
、startProductFragment
、...)。这个接口在我们的 libBase 中。它在应用程序模块中的 Activity 中实现。
在 Fragment 中,我们将 onAttach
中的 context
转换为 NavigationHelper
(同时检查上下文是否为 NavigationHelper,否则抛出异常):
private NavigationHelper mNavigationHelper;
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof NavigationHelper){
mNavigationHelper = (NavigationHelper) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement NavigationHelper");
}
}
然后调用mNavigationHelper.startProfileFragment()
切换Fragment即可。
感谢@Andrey 提醒我发布:)