Android开发之AndroidAnnotations框架的使用

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yubo_725

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值