Roboguice в ItemizedOverlay - PullRequest
       6

Roboguice в ItemizedOverlay

2 голосов
/ 24 февраля 2011

Я изучаю мир 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 () в модуле, но, похоже, это касается интерфейсов, а не данных. типы.

Мне кажется, что я должен определить параметр для MyItemizedOverlay в MyMappingActivity, где я выполняю @Inject, поскольку я не могу ссылаться на ресурсы Android внутри конструктора, не передавая их с помощью new MyItemizedOverlay ( ) .

У меня двоякие вопросы:

Во-первых, я иду по правильному пути? Во-вторых, как мне решить проблему с конструктором для MyItemizedOverlay?

1 Ответ

1 голос
/ 24 февраля 2011

Вот что я бы сделал:

  • Измените класс приложения так, чтобы оно было примерно таким:

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

Внедрение зависимостей - это хорошо, но иногда все усложняется.

...