Android片段和依赖注入

与天地兮比寿,与日月兮齐光。这篇文章主要讲述Android片段和依赖注入相关的知识,希望能为你提供帮助。
正如标题所说,我试图弄清楚哪一个是在片段中注入依赖的最佳方式。我希望独立于RoboGuice等外部框架。
【Android片段和依赖注入】现在,以最简单的方式,我有一个抽象某种逻辑的接口,并且,从一个Activity,我想注入一个这个接口的实现。我知道我必须为我的片段提供一个默认构造函数,因为系统可能需要在某个时刻重新创建片段,并且创建片段的新实例的常用方法是提供处理创建的静态方法这个:

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

我怎样才能将依赖关系传递给片段?我应该让它实现Parcelable或Serializable接口,然后将它打包到Bundle中吗?有没有其他方法来实现结果?
答案一个简单的解决方案是声明一个声明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的耦合,因为契约是由接口定义的。
另一答案你为什么不从你的活动中获取依赖?
public void onActivityCreated( Bundle b){ super.onActivityCreated(b) DependencyClass c = ((MyActivity)getActivity()).getDependency(); }

另一答案如果你不能通过构造函数传递依赖项(如果你需要一个默认的构造函数),并且你不想使用像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 } }


    推荐阅读