我正在探索RoboGuice的世界,并更改了地图活动以现在可以使用它。这是一个RoboMapActivity,并且我将Application的扩展名更改为继承自RoboActivity。我已成功使用@InjectView如下。

public class MyMappingActivity extends RoboMapActivity {

    @InjectView(R.id.mapview)             MapView mMapView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//setContentView injects all of the @values listed above
        setContentView(R.layout.main);
        DgApplication.data.setmPathProfile(this);
        List<Overlay> mapOverlays = mMapView.getOverlays();
        //etc...
    }
    //etc...
}


现在,我创建了一个ItemizedOverlay,这就是我遇到的问题。我已经添加了

@Inject MyItemizedOverlay mMyItemizedOverlay;


在MyMappingActivity中,MyItemizedOverlay的提取如下:

class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {

    @Inject
    public MyItemizedOverlay(Drawable marker) {
        super(boundCenterBottom(marker));
    }
}


我的问题是我必须使用构造函数中的默认标记为ItemizedOverlay父对象提供数据。我无法使用@InjectResource进行此操作,因为依赖注入在构造函数中似乎不受支持,并且我已经研究了模块中bind()。to()的使用,但这似乎是针对接口而非数据的类型。

我觉得我应该在执行@Inject的MyMappingActivity中定义MyItemizedOverlay的参数,因为如果不使用新的MyItemizedOverlay()传递它们,就无法从构造函数内部引用android资源。

我的问题是双重的:

首先,我是否沿着正确的方向前进?
其次,如何解决MyItemizedOverlay的构造函数的问题?

最佳答案

这就是我要做的:


修改您的Application类,使其具有以下特征:




private static Context instance;
@Override
public void onCreate() {
    super.onCreate();
    instance = this;
}
public static Context getContext(){
    return instance;
}




这将使您无论身在何处都可以获取上下文实例。


创建一个这样的AbstractModule




public final class YourGuiceModule extends AbstractModule {
    @Override
    protected void configure() {}

    @Provides public MyItemizedOverlay getMyItemizedOverlay(){
        Resources r = App.getContext().getResources();
        Drawable d = r.getDrawable(R.drawable.something);
        return new MyItemizedOverlay(d);
    }
}





通过在应用程序类中添加此模块来注册模块:




@Override
protected void addApplicationModules(List<Module> modules) {
    modules.add(new YourGuiceModule());
}





现在,您可以在代码中使用如下代码:




private MyItemizedOverlay mio;
...

@Inject
public void setMyItemizedOverlay(MyItemizedOverlay blah){
    mio = blah;
}




但是,请记住,与仅将其放入您的班级相比,这是太多的工作:

MyItemizedOverlay m = new MyItemizedOverlay(getResources().getDrawable(R.drawable.blah));


依赖注入是很好的方法,但有时会使事情变得比应有的复杂。

10-08 12:04