2

我正在开发一个使用NavigationDrawer的应用程序。Different fragments are placed into the content view of the MainActivitywhenever a menu item in the drawer is selected. 要通知已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);

问题mBusnullonAttach(). 它在onCreate().

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ((MyApp) getActivity().getApplication()).getObjectGraph().inject(this);
}

这是此类 Fragment 类的示例

参考:


您可以自己轻松地试用该示例:从NavigationDrawerAndroid Studio 中可用的模板创建一个新项目,添加DaggerOtto并尝试替换提到的回调。


工作解决方案:

4

1 回答 1

2

Otto您可以为您的总线创建提供程序,Dagger如下所示:

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

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

然后EventBusModule在创建ObjectGraph. 您可以在Application's中创建图表onCreate()

public class MyApplication extends Application{

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

}

您需要创建一个Injector具有一些静态方法和ObjectGraphApplication. 像这样的东西:

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在你Fragment的让给Dagger你一个Bus实例并注入Fragment

public class MyFragment extends Fragment{

    @Inject Bus mBus;

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

}
于 2014-05-20T16:56:35.360 回答