AndroidAnnotations是Android开发中使用的一个注解框架,主要是通过各种注解来完成很多繁琐的代码工作,比如通过控件id找到对应的控件,在不使用框架的情况下,经常需要写一大堆的findViewById,但是如果使用AndroidAnnotations框架,只需要在声明控件变量时,给这个变量加一个注解@ViewById就够了,findViewById就可以省略了。
AndroidAnnotations框架的github地址为:https://github.com/excilys/androidannotations
下面就记录一下如何在项目中使用AndroidAnnotations框架:
(1)新建工程,这里我们使用AndroidStudio创建TestAndroidAnnotations项目
(2)给项目导入AndroidAnnotations框架,导入方法为
<1>打开项目的全局build.gradle文件,在buildscript节点的dependencies中配置android-apt插件,build.gradle文件的代码如下:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
//配置android-apt插件
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
<2>打开app模块中的build.gradle文件,配置AndroidAnnotations,build.gradle文件的代码如下:
apply plugin: 'com.android.application'
//应用android-apt插件
apply plugin: 'com.neenbedankt.android-apt'
//定义androidannotations框架的版本号
def AAVersion = '4.0.0'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.test.testandroidannotations"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
//加入AndroidAnnotations依赖
apt "org.androidannotations:androidannotations:$AAVersion"
compile "org.androidannotations:androidannotations-api:$AAVersion"
}
(3)经过上面两小步后,就成功给项目导入了AndroidAnnotations框架,下面就可以在代码中使用AndroidAnnotations了,首先是Activity注入,没有使用框架前,我们给Activity设置布局文件时,是在onCreate方法中调用setContentView来完成布局文件的加载的,使用AndroidAnnotations框架后,可以直接在Activity上加注解并设置布局文件,代码如下:
@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
//省略其他代码
//...
}
当然,光这么做还不行,我们还需要在AndroidManifest文件中配置Activity,才能让注解生效,配置方法是,给注解的Activity更改文件名,比如上面的MainActivity,在AndroidManifest中应该配置成MainActivity_,如下面的代码所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.testandroidannotations">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity_"> <!-- 注意这里的Activity名称后面带了下划线 -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
这是因为AndroidAnnotations框架给我们注解的Activity生成了一个新的Activity,而新的Activity命名就是在原来的Activity类名后加上下划线。
(4)控件的注解。我们首先给MainActivity的布局文件中加入按钮和文本框,activity_main.xml文件的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context="com.test.testandroidannotations.MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30sp" />
<TextView
android:id="@+id/nameTextView"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30sp" />
<Button
android:id="@+id/btnClick"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="start" />
<Button
android:id="@+id/showMessageBtn"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="show message" />
</LinearLayout>
下面就是在MainActivity中获取控件了,MainActivity的代码如下:
package com.test.testandroidannotations;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Background;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.annotations.ViewById;
import org.w3c.dom.Text;
import java.util.Timer;
@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
//使用@ViewById注解控件变量,如果注解后面没有带控件id,则使用变量名当做控件id,这里即R.id.textView
@ViewById
TextView textView;
//使用@ViewById注解控件变量,如果注解后面带了id,则在布局文件中找对应id的控件
@ViewById(R.id.nameTextView)
TextView textView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//使用@AfterViews注解的方法,将会在所有的控件都初始化后自动被调用
@AfterViews
void init() {
textView.setText("Hello world");
textView2.setText("My name is Zhangsan");
}
//使用@Click注解的方法,将会在按钮被点击时得到调用,如果注解后面没带id,则默认使用方法名当做按钮的id
//如果注解后面带了id,则在布局文件中找对应id的控件并关联控件的点击事件为这个方法
@Click
void btnClick() {
startWork();
}
//这里关联的是布局文件中id为showMessage的按钮,该方法是以控件id + 'Clicked'来命名的
@Click
void showMessageBtnClicked() {
Toast.makeText(MainActivity.this, "show message!", Toast.LENGTH_SHORT).show();
}
//@Background注解的方法在子线程中执行
@Background
void startWork() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
showHint();
}
//@UiThread注解的方法在主线程中执行,这里要注意的是,不要导入错了包,因为在android.support.annotation包中也有UIThread类
@UiThread
void showHint() {
Toast.makeText(this, "finish!", Toast.LENGTH_SHORT).show();
}
}
程序运行的结果如下图所示:
这里记录一下我在使用AndroidAnnotations过程中遇到的坑:
1、注解的Activity一定要在AndroidManifest文件中改名,不然注解不会成功
2、在使用@UIThread注解方法时,要看清楚导入的包,我就是因为错误地导入了android.support.annotation里的包,导致程序从子线程中运行到UI线程时报错了
3、不要为一个按钮添加多个点击事件处理方法,比如按钮的id在xml文件中写的是showToastBtn,在写这个按钮的点击事件处理方法时,不要即写了void showToastBtn()又写了void showToastBtnClicked(),这样也是会报错的
关于AndroidAnnotations框架的更多用法,可以参考github上给出的代码:https://github.com/excilys/androidannotations/wiki
更多用法:http://www.csdn123.com/html/topnews201408/29/729.htm