我正在探索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));
依赖注入是很好的方法,但有时会使事情变得比应有的复杂。