如何使用Otto回调onAttach中的Activity?

时间:2014-05-20 16:40:27

标签: android callback navigation-drawer dagger otto

我正在开发一款使用NavigationDrawer的应用。每当选择抽屉中的菜单项时,将不同的片段放入MainActivity的内容视图中。 要通知MainActivity已成功附加Fragment以下回调:

public class CustomFragment extends Fragment {

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MainActivity) activity).onSectionAttached();
    }

}

由于我开始在项目中使用OttoDagger,我很好奇如何用.post()事件替换回调,例如:

mBus.post(new CustomFragmentAttachedEvent);

问题是mBus nullonAttach()onCreate()。它在@Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((MyApp) getActivity().getApplication()).getObjectGraph().inject(this); } 初始化。

NavigationDrawer

这是example of such a Fragment class

参考文献:


您可以自己轻松尝试该示例:使用Android Studio中提供的 {{1}}模板创建新项目,添加 Dagger Otto 并尝试替换上面提到的回调。


工作解决方案:

1 个答案:

答案 0 :(得分:2)

您可以使用OttoDagger总线创建提供商,如下所示:

@Module(injects = {
    YourFragment.class, 
    MainActivity.class
},complete = true)    
public class EventBusModule {

    @Provides
    @Singleton
    Bus provideBus() {
        return new Bus();
    }
}

然后在创建EventBusModule时注册ObjectGraph。您可以在Application onCreate()

中创建图表
public class MyApplication extends Application{

    public void onCreate() {
        Object[] modules = new Object[]{new EventBusModule()};
        Injector.init(modules);
    }

}

您需要创建一个Injector,其中包含一些静态方法和对ObjectGraph的引用,因此您可以在不引用Application的情况下对其进行操作。像这样:

public final class Injector {

    private static ObjectGraph objectGraph = null;

    public static void init(final Object... modules) {

        if (objectGraph == null) {
            objectGraph = ObjectGraph.create(modules);
        }
        else {
            objectGraph = objectGraph.plus(modules);
        }

        // Inject statics
        objectGraph.injectStatics();
    }

    public static final void inject(final Object target) {
        objectGraph.inject(target);
    }

    public static <T> T resolve(Class<T> type) {
        return objectGraph.get(type);
    }
}

然后您只需在@Inject中使用FragmentDagger为您提供Bus个实例并注入Fragment

public class MyFragment extends Fragment{

    @Inject Bus mBus;

    public void onAttach(){
        Injector.inject(this);
    } 

}