Android Annotationsとは
Javaによる記述を、アノテーションによる宣言に置き換えることで、Androidのコードを短く簡潔にするライブラリ。
実装スピード、可読性、保守性の面でも嬉しい。ヽ(•̀ω•́ )ゝ✧
http://androidannotations.org/
インストールはこんな感じ
build.gradleにAndroidAnnotationsの依存関係を記述。↓ページに全て書いてある。
http://www.jayway.com/2014/02/21/androidannotations-setup-in-android-studio/
- buildscript.dependenciesにandroid-aptのクラスパスを追加
- apply plugin: 'android-apt'の追加
- apt.arguments.androidManifestFileの追加
- dependenciesに apt "org.androidannotations:androidannotations:3.0+" を追加
- dependenciesに compile "org.androidannotations:androidannotations-api:3.0+" を追加
build.gradleの全体像は以下のようになる。
JSONICとかAQueryのdependenciesはココでは無視してOK。
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.9.+'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.2+'
}
}
apply plugin: 'android'
apply plugin: 'android-apt'
apt {
arguments {
androidManifestFile variant.processResources.manifestFile
}
}
repositories {
mavenCentral()
}
dependencies {
// Android Annotations
apt "org.androidannotations:androidannotations:3.0+"
compile "org.androidannotations:androidannotations-api:3.0+"
// JSON manager
compile 'net.arnx:jsonic:1.2.9'
// AQuery
compile 'com.googlecode.android-query:android-query:0.25.9'
compile fileTree(dir: 'libs', include: '*.jar')
}
android {
compileSdkVersion 17
buildToolsVersion "19.0.0"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
instrumentTest.setRoot('tests')
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
}
Gradle Syncを実行する。
External Libraries に androidannotatinos-apiができていればOK。
使用例
本家。ひと目で効果のほどがわかるナイスなトップページ
サンプルが簡潔でわかりやすい
ハマりどころ
AndroidManifest.xmlで宣言しているActivity名の末尾に _ をつける必要あり。(MainActivity -> MainActivity_)
実際の動作の際は、アノテーションを解釈して自動生成した子クラス(_つきクラス)を実行することになる。
が、Activity末尾に _ をつけても、ビルドの際にそんなActivityクラスないよと怒られる。
Build -> rebuild project
File -> Invalidate Caches / Restart...
で解消。
また、子クラスを自動生成して実行することから、
privateなフィールドやメソッドはprotectedに置き換える必要がある。
onCreate()の代わりに@AfterViewsのアノテーションをつけたメソッドを初期化メソッドとして使用する。
onCreate()内で@ViewByIdのフィールドにアクセスするとNullPointerExceptionで落ちる。
@ViewByIdが効いていないのだろうか、設定ミスったかと思ったが、
以下のページに答えがあった。
http://code.google.com/p/androidannotations/wiki/LayoutAndViews
When onCreate() is called, @ViewById fields are not set yet. Therefore, you can use @AfterViews on methods to write code that depends on views.
@ViewByIdのフィールドがセットされた後の初期化処理、
Viewに対しての処理を行ないたい場合は、@AfterViewsを使ってねということ。
つまり、@ViewByIdのフィールドに対しての処理を行なわないならば、
onCreate()内に書いてOK。
処理の流れとしては以下のようになる。
onCreate() -> @ViewByIdフィールドへのセット -> @AfterViewsのメソッド
滑り出しで躓いたが、コードが短くなっていく過程は楽しい。
Javaは記述が冗長でストレスフルな言語だと思うこともあったが、
逆にそれだけ短くする楽しさもある
