android - 如何将片段注入活动,以便我不必手动创建它的实例?
问题描述
我正在开发一个 android 项目并使用 Dagger2 进行依赖注入?我正在尝试将 Fragment 注入 Activity 但我不想创建片段实例,使用 newInstance或new SomeFragment并希望实例由 dagger 创建并注入。
我也想知道如果想传递一些论点,我该怎么做。
解决方案
即使您不想调用new
,Android 也会:这就是为什么Fragment 需要具有零参数的公共构造函数的原因,因为如果您从包中恢复 FragmentActivity,Android 将反射性地调用 Fragment 构造函数。
因此,您创建的大多数 Fragment 不应该声明它们自己的构造函数,当然也不应该有一个@Inject
带参数的带注释的构造函数:只要有一个零参数的公共构造函数,Android 就不会抱怨,但 Dagger 不会参与以这种方式创建您的 Fragment,如果有两种不相关的方法来创建您的 Fragment,它将降低您阅读和理解代码的能力。
相反,您可以使用newInstance
在 Bundle 中设置参数来创建 Fragment 实例,然后您可以在Fragment#onCreate
. 如果您没有要传递的任何参数,则可以new
显式调用,但这newInstance
可能是一种良好的一致做法,因此如果 Fragment 接受参数,则更改较少。
要在 Fragment 实例中获取 Dagger 提供的依赖项,标准做法是 [调用AndroidInjection.inject(this)
或AndroidSupportInjection.inject(this)
in onAttach
,如dagger.android 文档中关于注入 Fragment的内容。实现这一点的简单方法是从 DaggerFragment 继承,但也欢迎您自己这样做。为了找到一个组件来注入你的 Fragment,AndroidSupportInjection 将递归地检查父层次结构中扩展 HasSupportFragmentInjector 的 Fragment,然后尝试 Activity,然后是 Application;如果您将 dagger.android 的标准设计与 ContributesAndroidInjector 一起使用,Dagger 将为您的 Fragment 创建一个子组件实例,允许您引入 Fragment 范围的依赖项。
推荐阅读
- python - 使用 pandas 过滤并查找总计数和百分比
- angular - Angular中现有方法的无限滚动
- javascript - 如何使用 jQuery 动态选择值
- javascript - Getting the same value in an php button in javascript with AJAX
- javascript - How can I better control this jQuery UI script, which adds an overlay to a div on a mouseover/mouseout event?
- go - How to execute the master go scritpt in kubernetes
- swift - Problem with incorrect NSRange of selected text in NSTextView in function under control of NSText.didChangeNotification
- gis - QGIS 3.4 - Problem adding layers with QgsProject.instance().addMapLayer()
- druid - Connecting Tableau to Apache Druid
- java - 如何从 JSON 字符串创建 JAVA 对象?