正如标题所说,我正在试图弄清楚哪一个是在片段中注入依赖的最佳方式。 我希望独立于RoboGuice等外部框架。
现在,以最简单的方式,我有一个抽象某种逻辑的接口,而且,从一个Activity,我想注入一个这个接口的实现。我知道我必须为我的片段提供一个默认构造函数,因为系统可能需要在某个时刻重新创建片段,并且创建片段的新实例的常用方法是提供处理创建的静态方法这样:
public static Fragment newInstance() {
final Bundle bundle = new Bundle();
...
final Fragment fragment = new MyFragment();
fragment.setArguments(bundle);
return fragment;
}
如何将依赖项传递给片段?我应该让它实现Parcelable或Serializable接口,然后将它打包到Bundle中吗?还有其他方法可以达到效果吗?
答案 0 :(得分:9)
一个简单的解决方案是声明一个声明Fragment所需的依赖关系的接口。然后让Fragment的Context实现此接口,并在需要时从Context中轮询依赖项。
合同:
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")
}
}
因此,事实上,没有不必要的与Activity的耦合,因为契约是由接口定义的。
答案 1 :(得分:-1)
为什么不从活动中获取依赖关系?
public void onActivityCreated( Bundle b){
super.onActivityCreated(b)
DependencyClass c = ((MyActivity)getActivity()).getDependency();
}
答案 2 :(得分:-1)
如果你不能通过构造函数传递依赖项(如果你需要一个默认的构造函数),并且你不想使用像Dagger或RoboGuice这样的依赖注入库,那么另一种经典的方法是到一个二传手,注射"依赖。
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
}
}