【十一】注入フレームRoboGuice使用:(Your First Injection into a Custom View class)


前回はRoboGuiceの使用について簡単に紹介しました(【十】注入フレームRoboGuiceの使用:(Your First Testcase))、今日はカスタムViewの注入(Custom View)を見てみましょう.
本稿を開始する前に、通常のJavaオブジェクトの注入に慣れておく必要があります(クリックしてください).RoboGuice 3.0のバージョンでは、カスタムView(Custom View)も同様に行います.
class MyView extends View {
    @Inject Foo foo; 
    @InjectView(R.id.my_view) TextView myView;

    public MyView(Context context) {
        inflate(context,R.layout.my_layout, this);
        RoboGuice.getInjector(getContext()).injectMembers(this);
    }

    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        inflate(context,R.layout.my_layout, this);
        RoboGuice.getInjector(getContext()).injectMembers(this);
    }

    public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
        inflate(context,R.layout.my_layout, this);
        RoboGuice.getInjector(getContext()).injectMembers(this);
    }

    @Override
    public void onFinishInflate() {
        super.onFinishInflate();
        //All injections are available from here
        //in both cases of XML and programmatic creations (see below)
        myView.setText(foo.computeFoo());
    }
}
Androidでは、2つの方法でViewを作成できます.
①:XMLから自動的にロード
②:プログラム方法、new CustomView(Context context)で作成
RoboGuice 3.0バージョンを使用すると、いずれの場合も、明示的な注入によってRoboGuiceからの注入が取得されることを確認します.
Roboguice 3.1バージョンでは、いくつかの違いがあります.
Roboguice 3.1は、XMLによって完全にロードされ、Viewのすべてのサブコントロールに自動的に注入されます.XMLのロード中に、onFinishInflate()メソッドが自動的にコールバックされることに注意してください.しかし、自分で追加の構造関数を提供する場合は、RoboGuiceを通じて注入する責任を負う必要があります.
後者の場合、コンストラクション関数の最後にonFinishInflate()メソッドが呼び出されます.RoboGuiceテンプレートを使用する場合は、このコールバックメソッドを使用してすべてのコンストラクション関数を処理すると、カスタムビューが注入されます.
次に例を示します.
class MyView extends View {
    @Inject Foo foo; 
    @InjectView(R.id.my_view) TextView myView;

    public MyView(Context context) {
        inflate(context,R.layout.my_layout, this);
        RoboGuice.getInjector(getContext()).injectMembers(this);
        onFinishInflate();
    }

    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        inflate(context,R.layout.my_layout, this);
    }

    public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
        inflate(context,R.layout.my_layout, this);
    }

    @Override
    public void onFinishInflate() {
        super.onFinishInflate();
        //All injections are available from here
        //in both cases of XML and programmatic creations (see below)
        myView.setText(foo.computeFoo());
    }
}