2

我正在探索 RoboGuice 的世界,并将地图活动更改为现在可以使用它。它是一个 RoboMapActivity,我已将应用程序的扩展更改为从 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 ,因为如果不使用new MyItemizedOverlay()传递它们,我就无法从构造函数内部引用 android 资源。

我的问题是双重的:

首先,我是否走在正确的轨道上?其次,如何解决 MyItemizedOverlay 的构造函数的问题?

4

1 回答 1

1

这就是我要做的:

  • 修改您的 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));

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

于 2011-02-24T13:48:24.947 回答