如何将片段注入 activity 以便我不必手动创建它的实例?

How can I inject fragment into activity so that I don't have to manually create its instance?

我正在开发一个 android 项目并使用 Dagger2 进行依赖注入?我正在尝试将 Fragment 注入 Activity 但我不想创建片段实例,using newInstancenew SomeFragment 并且想要由 dagger 创建并注入的实例。

我也想知道如果想传递一些参数,我该怎么做。

即使您不想调用 new,Android 也会:这就是 Fragment is required to have a zero-arg public constructor, because if you restore a FragmentActivity from a bundle, Android will reflectively call the Fragment constructor.

的原因

因此,您创建的大多数 Fragment 不应该声明它们自己的构造函数,当然也不应该有带参数的 @Inject-注释构造函数:Android 不会抱怨,只要有是一个零参数 public 构造函数,但 Dagger 不会以这种方式参与创建你的 Fragment,如果有两种不相关的方法来创建你的 Fragment,它会降低你阅读和理解代码的能力。

相反,您可以使用 newInstance 创建一个 Fragment 实例,并在 Bundle 中设置参数,然后您可以在 Fragment#onCreate 中读取和扩展它。如果您没有要传递的任何参数,您可以显式调用 new,但 newInstance 可能是一个很好的一致做法,因此如果 Fragment 接受参数,则无需更改。

要在您的 Fragment 实例中获取 Dagger 提供的依赖项,标准做法是 [在 onAttach 中 [调用 AndroidInjection.inject(this)AndroidSupportInjection.inject(this),就像在 dagger.android docs on injecting Fragment. The easy way to do this is by inheriting from DaggerFragment 中一样,但也欢迎您自己这样做。为了找到一个组件来注入你的片段,AndroidSupportInjection 将递归地检查父层次结构以查找扩展 HasSupportFragmentInjector 的片段,然后将尝试 Activity,然后是应用程序;如果您将 dagger.android 的标准设计与 ContributesAndroidInjector 一起使用,Dagger 将为您的 Fragment 创建一个子组件实例,允许您引入 Fragment 范围的依赖项。