Android片段和依赖注入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android片段和依赖注入相关的知识,希望对你有一定的参考价值。

正如标题所说,我试图弄清楚哪一个是在片段中注入依赖的最佳方式。我希望独立于RoboGuice等外部框架。

现在,以最简单的方式,我有一个抽象某种逻辑的接口,并且,从一个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
    }
}

以上是关于Android片段和依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

Android Dagger片段可以访问AppModule和ActivityModule依赖关系,但不能访问FragmentModule依赖关系

Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )(代码片段

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

onBackPressed 上的 Android 片段 NullPointerException

使用循环片段依赖关系模块化单活动Android应用程序

Eclipse OSGi 包需要另一个包的片段