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