2

私は RoboGuice の世界を探索しており、maps アクティビティを変更して、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 にパラメーターを定義する必要があるように感じます。これは、 new MyItemizedOverlay()を使用して渡さずにコンストラクター内から Android リソースを参照できないためです。

私の質問は 2 つあります。

まず、私は正しい道を進んでいますか?次に、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 に答える