Android LayoutからActivity FieldへのViewの注入

まったくAndroidの話しになっていませんでしたけど、Android+Guiceを調べ始めたのは元々ActivityのFieldへのViewの注入がうざいのをスマートに解決できないかなー?という事でした。

ここまで調べて来て今更なんですが、、、、ActivityのLife Cycleは基本的にAndroidのSystem側まかせだからダメじゃね?…orz

って事で今日は別アプローチを。

Activityで宣言したFieldに対してViewの実態の注入をするために以下のようなコードを書いている人が殆どじゃないのかなと。

public class MainActivity extends Activity {
 private EditText editText; private Button buttonOK; private TextView textView;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

 editText = (EditText) findViewById(R.id.editText1); buttonOK = (Button) findViewById(R.id.button1); textView = (TextView) findViewById(R.id.textView1);
      .
      .
      .
  }
}

不満点は、、、

 

  • リソースとの関連付けが直感的でない。

 

  • キャストしている。

 

  • コードが長い。

 

といったあたりでしょうか。

最近DIにも慣れてきたので、ここの改善に使えるかなと思っていたのです。

ですが通常FactoryからInstanceを作成してその時に依存性を注入するDIの実装とは違って、ActivityはAndroidのSystemが作りますしLayoutをロードするまでは注入すべきViewも存在しない状態です。

というわけで、今のアプローチじゃダメだなと今更気がついたので方針転換して自分で好きな様に実装してみる事にします。

ってことでアノテーションとReflection使って適当に実装してみました。

import org.x68k.android.annotation.ViewID; import org.x68k.android.app.InjectableActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextEdit;
import android.widget.TextView;

public class InjectViewActivity extends InjectableActivity {
 @ViewID(R.id.edittext1) private EditText editText; @ViewID(R.id.buttonok) private Button buttonOK; @ViewID(R.id.textview) private TextView textView;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main); // ここで自動的にbuttonOKにViewが注入されます

    buttonOK.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        .
        .
        .
      }
    });
  }
}

と、こんな感じで組める様になります。思った以上にすっきりするなぁ。

とりあえずjarのファイルを添付しようと思ったらできない、、、。なんでじゃ。ソースは調整して公開します。

それにしても今回初めてリフレクションとアノテーションの実装をしてみましたが、コード量少なくて簡単に実装できるもんんなんすねー。ちょっと感動しました。