Android片段和dependency injection

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

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

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

我怎么能传递我的依赖到片段? 我应该使它实现Parcelable或Serializable接口,然后将其打包到Bundle中? 有没有其他方法可以达到这个效果?

谢谢!

Solutions Collecting From Web of "Android片段和dependency injection"

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

合同:

 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,因为契约是由一个接口定义的。

你为什么不抓住你的活动的依赖?

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

如果你不能通过构造函数传递依赖关系(如果你需要一个默认的构造函数),并且你不想使用像Dagger或者RoboGuice这样的dependency injection库,另一个经典的方法是让一个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 } }