Android片段和依赖注入

Android片段和依赖注入,android,dependency-injection,dependencies,fragment,code-injection,Android,Dependency Injection,Dependencies,Fragment,Code Injection,正如标题所说,我试图找出哪种方法是在片段中注入依赖项的最佳方法。 我想独立于外部框架,如RoboGuice等 现在,以可能最简单的方式,我有一个抽象某种逻辑的接口,并且,从一个活动中,我想注入这个接口的一个实现。我知道我必须为我的片段提供一个默认构造函数,因为系统可能需要在某个时候重新创建片段,并且通常创建片段新实例的方法是提供静态方法,该方法处理创建过程如下: public static Fragment newInstance() { final Bundle bundle = ne

正如标题所说,我试图找出哪种方法是在片段中注入依赖项的最佳方法。 我想独立于外部框架,如RoboGuice等

现在,以可能最简单的方式,我有一个抽象某种逻辑的接口,并且,从一个活动中,我想注入这个接口的一个实现。我知道我必须为我的片段提供一个默认构造函数,因为系统可能需要在某个时候重新创建片段,并且通常创建片段新实例的方法是提供静态方法,该方法处理创建过程如下:

public static Fragment newInstance() {
    final Bundle bundle = new Bundle();
    ...
    final Fragment fragment = new MyFragment();
    fragment.setArguments(bundle);
    return fragment;
}

如何将依赖关系传递给片段?我应该让它实现可打包或可序列化的接口,然后将其打包到包中吗?是否有其他方法可以实现此结果?

为什么不从活动中获取依赖关系

public void onActivityCreated( Bundle b){
     super.onActivityCreated(b)
     DependencyClass c = ((MyActivity)getActivity()).getDependency();
}

一个简单的解决方案是声明一个接口,该接口声明片段所需的依赖项。然后让片段的上下文实现这个接口,并在需要时从上下文轮询依赖项

合同:

public interface MyDependencies {

    MyDep getDep();

}
活动:

public MyActivity extends Activity implements MyDependencies {

    @Override
    public MyDep getDep(){
       return createMyDependencyOrGetItFromASingletonOrGetItFromApplication()
    }
}
片段:

public void onActivityCreated(Bundle b){
     super.onActivityCreated(b)

     if (getActivity() instanceOf MyDependencies) {
         MyDep dep = ((MyDependencies) getActivity).getDep();
     } else {
         throw new RuntimeException("Context does not support the Fragment, implement MyDependencies")
     }
}

因此,事实上,没有不必要的活动耦合,因为契约是由接口定义的

如果无法通过构造函数传入依赖项(如果需要默认构造函数),并且不想使用Dagger或RoboGuice之类的依赖项注入库,那么另一种经典方法是使用setter“注入”依赖项

Fragment MyFragment {

Depend mDepend;

....


    public void setDepend(Depend depend) {
        mDepend = depend;
    }

}
然后在活动中,可以将依赖项注入onCreate方法

所以在你的活动中有这样的事情:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);
    MapFragment wrapperFragment = new WrapperFragment();
    if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.map_container, wrapperFragment).commit();
    // find the fragment
    // call the setter
    }
}

如果我这样做的话,我最终会将片段与活动耦合,对吗?我仍然希望片段是独立的和可重用的。这个解决方案的问题是,当android重新创建片段时,它使用默认构造函数,并且不调用set方法,即使它们以前被调用过。我喜欢这个方法名称“createMyDependencyOrgetFromSingletonOrgetFromApplication”