5

こんにちは、私たちが知っているように、私は現在 roboguice を使用しています。アノテーションを使用して、次のようなクラスを注入できます。

@InjectView(R.id.list)ListView x

@inject 表記が機能するのは、RoboActivity または任意の Robo クラスから拡張されているためです。

私の質問は、と呼ばれるカスタムクラスを注入したいかどうかです

public class CustomUtilManager {
}

私はRoboActivityと言ってInjectできるようにしたい

@Inject CustomUtilMananger

どうすればいいのですか?

私の2番目の質問は、クラスがある場合、それはRobo *クラスのサブクラスではないということです

いう

public class MyOwnClass {
}

インジェクターを取得して、別の注入可能なクラス (CustomUtilManager など) を注入する方法

つまり、私はどのように言うことができますか

public class MyOwnClass {
    @Inject CustomUtilManager customUtilManager;
}
4

1 に答える 1

10

RoboActivity でのカスタム クラスのインジェクション

@Injectアノテーションを使用するだけでカスタム クラスを注入できますが、注入されたクラスは次の条件のいずれかを満たす必要があります。

  • カスタム クラスにはデフォルトのコンストラクタがあります (引数なし)
  • カスタム クラスには、注入されたコンストラクターが1 つあります。
  • カスタム クラスには、インスタンス化を処理するプロバイダーがあります (より複雑です)。

最も簡単な方法は、明らかにデフォルトのコンストラクターを使用することです。コンストラクターに引数が必要な場合は、注入する必要があります。

public class CustomClass {

    @Inject
    public CustomClass(Context context, Other other) {
        ...
    }

}

@Injectコンストラクターの注釈に注意してください。各引数のクラスも、RoboGuice によって注入可能でなければなりません。Android クラスのいくつかのインジェクションは、RoboGuice によってすぐに提供されます (例: Context)。RoboGuice が提供する注射

カスタム クラスへのインジェクション

カスタム クラスのインスタンスを RoboGuice (たとえば、@Inject注釈) で作成すると、 でマークされたすべてのフィールドが@Inject自動的に挿入されます。

を使用する場合new CustomClass()は、自分でインジェクションを行う必要があります。

public class CustomClass {

    @Inject
    Other other;

    Foo foo;

    public CustomClass(Context context) {
        final RoboInjector injector = RoboGuice.getInjector(context);

        // This will inject all fields marked with the @Inject annotation
        injector.injectMembersWithoutViews(this);

        // This will create an instance of Foo
        foo = injector.getInstance(Foo.class);
    }

}

Contextインジェクターを取得できるようにするには、コンストラクターにa を渡す必要があることに注意してください。

于 2013-06-28T22:46:52.270 に答える