androidannotations虎の巻

これぐらいわかれば使えそうだということをまとめてみた。

Android Studioでの環境設定

前に書いた。

xmlと変数とのヒモ付

以下のように簡単にかける。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/imgView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/txtView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ListView
        android:id="@+id/lstView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

こういうxmlファイルが有った場合に

@EActivity(R.layout.activity_main)
public class MainAcitvity extends Acitvity {

    // R.idで指定できる
    @ViewById(R.id.imgView)
    protected ImageView imgView;

    // 指定を除外した場合は変数名=idとして紐付けられる
    @ViewById
    protected TextView txtView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @AfterViews
    protected void init() {
        // findViewByIdで@ViewByIdで指定された変数に値が入った後に
        // ここが呼ばれる。
        // onCreateで変数を使うとぬるぽで落ちるので注意
    }

    @Click(R.id.btn)
    protected void btnClick(View view) {
        // クリックイベントのバインドも簡単にできる。
        // 裏ではR.id.btnのsetOnClickListenerが呼ばれる
    }

    @ItemClick(R.id.lstView)
    protected void lstViewItemClick(MyItem clickedItem) {
        // リストViewのItemClickもできる
    }
}

こうかける。上はアクティビティの例だけど、Fragment(@EFragment)、ViewGroup(@EViewGroup)でも同じようなことが出来る。LinearLayoutとか作るときに便利。

AndroidManifest.xmlの書き方

acitivtyの指定は自動生成されるソースのファイル名を書く必要がある。そのためActivity名に_がついたものを書く必要がある。注意するのはそれぐらい。

    <!-- MainActivityが自動生成されるとMainActivity_となる -->
    <activity
        android:name=".activity.MainActivity_"
        android:screenOrientation="portrait" />

Background / UiThread

ちょっとした非同期実装ならアノテーションで書くことが出来る。EActivity等で使用することが出来る。

    @Background
    protected void getHttp() {
        // ここはバックグラウンドで実行される
        // Http通信とかよくやると思う
        String result = getHttp();
        finishHttp(result);
    }

    @UiThread
    protected void finishHttp(String result) {
        // ここはUIスレッドになる。
        // 画面操作等はここでやる。Toastを出すのも問題ない。
        Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
    }

Activityの起動

起動する場合は以下のように記載する


    new MainActivity_.IntentBuilder_(this).start();

結果が欲しい場合はstartForResultを使う。


    new MainActivity_.IntentBuilder_(this).startForResult(REQUEST_CODE);

Activityに値を渡したい場合は@Extraを使うと便利


@EActivity(R.layout.activity_main)
public class MainAcitvity extends Acitvity {

    // 型は色々指定することが出来る
    @Extra
    protected int extInt;
    @Extra
    protected String extString

こういう定義をした場合、呼び出し時に指定することが出来る


    new MainActivity_
        .IntentBuilder_(this)
        .extInt(intValue)
        .extString(stringValue)
        .start();


Fragmentのビルド

ビルダーを使ってビルドする

    SampleFragment_.builder().build();

値を渡したい場合は受け取り側で@FragmentArgで指定しておけば受け取れる。


@EFragment(R.layout.fragment_sample)
public class SampleFragment extends Fragment {

    // 型は色々指定することが出来る
    @FragmentArg
    protected int extInt;
    @FragmentArg
    protected String extString

こういう定義をした場合、呼び出し時に指定することが出来る


    SampleFragment_
        .builder()
        .extInt(intValue)
        .extString(stringValue)
        .build();

ViewGroupのビルド

ビルダーを使ってビルドする

    LinearLayoutView_.build(this);

値の設定とかできないから、publicメソッドでも作ってデータを紐付けすればいいと思う。

Preferenceの使用

プリファレンスもインターフェースを作るだけで簡単に触れる。Editorとかkeyとか指定しなくていいから簡単。

@SharedPref(value = SharedPref.Scope.UNIQUE)
public interface SharedPreferenceInf {

    // 関数として書く必要がある
    int intValue();
    String stringValue();

使う時の定義は@Prefで指定する


    @Pref
    protected SharedPreferenceInf_ pref;

値にアクセスするときはget()、put()を使用する


    // getで取得
    int intValue = pref.intValue().get();

    // putで編集
    pref.stringValue().put("hogehoge");


まとめ

これぐらいわかってれば色々捗ると思う。特に@Backgroundと@UiThreadは非常に便利。これを使うためにArrayAdapterが作成するViewをAndroidAnnotationsを使ってビルドする価値はあると思う。僕が使ってる時はprogardがうまく動かなかったけど、今のバージョンだと出来るようになってるのかなぁ。