android - 我怎样才能将 fragment 注入(inject)到 Activity 中,这样我就不必手动创建它的实例了?

标签 android android-fragments dagger-2 dagger

我正在开发一个 android 项目并使用 Dagger2 进行依赖注入(inject)?我正在尝试将 Fragment 注入(inject)到 Activity 中,但我不想创建 fragment 实例,using newInstancenew SomeFragment 并希望实例由 dagger 创建并注入(inject)。

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

最佳答案

即使您不想调用new,Android 也会:这就是为什么Fragment is required to have a zero-arg public constructor ,因为如果你从一个 bundle 中恢复一个 FragmentActivity,Android 将 reflectively call the Fragment constructor .

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

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

要在 Fragment 实例中获取 Dagger 提供的依赖项,标准做法是在 onAttach,如 dagger.android docs on injecting Fragment .执行此操作的简单方法是 inheriting from DaggerFragment ,但也欢迎您自己这样做。为了找到一个组件来注入(inject)你的 Fragment,AndroidSupportInjection 将递归地检查父层次结构以查找扩展 HasSupportFragmentInjector 的 Fragment,然后将尝试 Activity,然后是 Application;如果您使用带有 ContributesAndroidInjector 的 dagger.android 的标准设计,Dagger 将为您的 Fragment 创建一个子组件实例,允许您引入 Fragment 范围的依赖项。

关于android - 我怎样才能将 fragment 注入(inject)到 Activity 中,这样我就不必手动创建它的实例了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55493834/

相关文章:

android - 即使手机处于锁定模式也会显示 Activity

android - 如何使内容绘制在非全宽工具栏后面(如新的 Gmail 或 Google App)

java - 屏幕旋转后恢复 fragment 中微调器的位置

android - DialogFragment 已触发,但未在 Navigation Architecture 组件中显示布局

java - Android - Dagger 注入(inject)非 Activity 或 fragment

java - 如何更新线程中的引用和 Activity ?

android - 获取 MediaPlayer 的状态

android - 查看页面 : override getItemPosition(Object object) method

android - ExpandableListFragment 与 LoaderManager 兼容包

android - Dagger 2 - 如何注入(inject)一个我不控制其对象实例化的类