【问题标题】:Roboguice in ItemizedOverlayItemizedOverlay 中的 Roboguice
【发布时间】:2011-02-24 13:33:43
【问题描述】:

我正在探索 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( ).

我的问题有两个:

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

【问题讨论】:

    标签: android google-maps roboguice


    【解决方案1】:

    这就是我要做的:

    • 修改您的应用程序类,使其具有如下内容:

    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));
    

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

    【讨论】:

    • 谢谢,我同意它太复杂了。我想我只是在探索是否可以使用依赖注入进行一些单元测试。
    • 碰巧我还在常见问题解答中遇到了另一个解决方案:code.google.com/p/google-guice/wiki/FrequentlyAskedQuestions“如何通过 Guice 创建对象时传递参数?”
    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多