Android Studio配置Android Annotations框架详解--说说那些坑
我们开发过程中都需要写些findViewByid、serOnclickListener等类似的代码,虽然不费事,但是一个项目下来,工作量还是很大的。为了节省工作量,运生了很多对应的注解框架。网上的博客、身边的同事大多使用的是 xUtils、ButterKnife实现注解,我初次使用的也是ButterKnife。然而,今天小试了下Android Annotations注解框架,用起来确实比ButterKnife爽。其他的介绍和废话就不多说了,下面就介绍如何在
Android Studio中配置Android Annotations框架,以及我所发现的坑。 AA官网:http://androidannotations.org/ AA Github:https://github.com/excilys/androidannotations AA Github wiki页:https://github.com/excilys/androidannotations/wiki AA Github Gradle配置页:https://github.com/excilys/androidannotations/wiki/Building-Project-Gradle 以上网址是很有用的,尤其是Gradle配置页。AA框架配置比较蛋痛,看似简单,但是有很多小细节。我今天在网上搜了很多博客,都没弄成功,总是报错。英文不好而官网的配置有一直没找到。其实不用再去看其他人写的博客文档了,或过时或错误很误导人。接下来我带领大家根据官方Gradle配置搭建和使用AA框架。
一、新建一个项目。 二、在project根目录下的build.gradle文件中,添加:
- classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
这个地方的版本号是1.8,就用最新的吧,怎么知道这个最新的版本号呢?去这儿查:右键整个项目-》Open Module Settings-》点击左侧的app-》点击右边顶部的Dependencies-》右上角的+号-》选择1.Dependency-》输入com.neenbedankt.gradle.plugins:android-apt 回车查询版本号。 这个文件的配置就完成了。官网文档和许多网上的博客都说还要修改依赖库,即mavenCentral()发现也可以不改,无所谓。
- apply plugin: 'com.android.application'
- apply plugin: 'android-apt' //1处添加
- def AAVersion = '4.0.0'
- android {
- compileSdkVersion 23
- buildToolsVersion "24.0.0"
- defaultConfig {
- applicationId "com.znke.androidannotations_test"
- minSdkVersion 15
- targetSdkVersion 23
- versionCode 1
- versionName "1.0"
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- }
- dependencies {
- compile fileTree(include: ['*.jar'], dir: 'libs')
- testCompile 'junit:junit:4.12'
- compile 'com.android.support:appcompat-v7:23.4.0'
- apt "org.androidannotations:androidannotations:$AAVersion" //2处添加
- compile "org.androidannotations:androidannotations-api:$AAVersion"
- }
- apt { //3处添加
- arguments {
- androidManifestFile variant.outputs[0]?.processResources?.manifestFile//new style
- //androidManifestFile variant.processResources.manifestFile //old style
- resourcePackageName "com.znke.androidannotations_test" //your pakcage name
- }
- }

apply plugin: 'com.android.application'
apply plugin: 'android-apt' //1处添加
def AAVersion = '4.0.0' android {
compileSdkVersion 23
buildToolsVersion "24.0.0" defaultConfig {
applicationId "com.znke.androidannotations_test"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
} dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0' apt "org.androidannotations:androidannotations:$AAVersion" //2处添加
compile "org.androidannotations:androidannotations-api:$AAVersion"
} apt { //3处添加
arguments {
androidManifestFile variant.outputs[0]?.processResources?.manifestFile//new style
//androidManifestFile variant.processResources.manifestFile //old style
resourcePackageName "com.znke.androidannotations_test" //your pakcage name
}
}
说明:apply plugin: 'android-apt' 是引用下面的这部分: 三、接下来在app module下的build.gradle文件中添加配置:
- apt {
- arguments {
- androidManifestFile variant.outputs[0]?.processResources?.manifestFile//new style
- //androidManifestFile variant.processResources.manifestFile //old style
- resourcePackageName "com.znke.androidannotations_test" //your pakcage name
- }
- }

apt {
arguments {
androidManifestFile variant.outputs[0]?.processResources?.manifestFile//new style
//androidManifestFile variant.processResources.manifestFile //old style
resourcePackageName "com.znke.androidannotations_test" //your pakcage name
}
}
apt这部分是需要查找和解析androidManifestFile文件吧!切记,需要注意的地方
- androidManifestFile variant.outputs[0]?.processResources?.manifestFile

androidManifestFile variant.outputs[0]?.processResources?.manifestFile
这句话,中间有问号,根据官网的来。有很多博客上都不是这么写的,坑死我了,总是报属性为空错误。里面的resourcePackageName可不写,无大碍。def AAVersion = '4.0.0'部分,就是定义了一个变量名AAVersion的值是'4.0.0',此处版本号用最新的吧。在dependencies 节点中添加
- apt "org.androidannotations:androidannotations:$AAVersion"
- compile "org.androidannotations:androidannotations-api:$AAVersion"

apt "org.androidannotations:androidannotations:$AAVersion"
compile "org.androidannotations:androidannotations-api:$AAVersion"
两句,引用上面的版本号,貌似也可直接把$AAVersion替换成4.0.0版本号,去掉def AAVersion = '4.0.0',试过可行。算了还是根据上面官网的配置来吧。 def AAVersion = '4.0.0'里面的版本号根据org.androidannotations:androidannotations去搜索查询(依照最开始说的方式查询)。
配置完毕。接下来做个小例子试试手。第一个界面,一个输入框和一个按钮。点击按钮获取值,跳转到第二个页面并显示值。就这么简单,看看AA注解怎么用。上代码:
- AndroidManifest.xml
- <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_">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".Main2Activity_"/>//对,没错,最后面加下划线
- </application>

AndroidManifest.xml
<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_">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Main2Activity_"/>//对,没错,最后面加下划线
</application>
- MainActivity
- @EActivity(R.layout.activity_main) //注入页面
- public class MainActivity extends AppCompatActivity {
- @ViewById
- public EditText username;//如果页面的id与此处对象名一样,@ViewById后面可以省略
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //setContentView(R.layout.activity_main);//这儿不要了
- //跟UI无关的数据初始化可以写在这里
- }
- @Click
- void submit(){//如果页面button的id和方法名一样,@Click后面可以省略
- //跳转到Main2Activity界面,看看这个跳转牛逼不,包含了intent,extra带参数,start启动。
- Main2Activity_.intent(this).extra("msg",username.getText().toString()).start();
- }
- }

MainActivity
@EActivity(R.layout.activity_main) //注入页面
public class MainActivity extends AppCompatActivity { @ViewById
public EditText username;//如果页面的id与此处对象名一样,@ViewById后面可以省略 @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);//这儿不要了 //跟UI无关的数据初始化可以写在这里 } @Click
void submit(){//如果页面button的id和方法名一样,@Click后面可以省略
//跳转到Main2Activity界面,看看这个跳转牛逼不,包含了intent,extra带参数,start启动。
Main2Activity_.intent(this).extra("msg",username.getText().toString()).start();
}
}
- R.layout.activity_main
- <RelativeLayout 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">
- <EditText
- android:id="@+id/username"
- android:layout_width="match_parent"
- android:layout_height="200dp"
- android:gravity="left" />
- <Button
- android:id="@+id/submit"
- android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_alignParentBottom="true"
- android:text="提交" />
- </RelativeLayout>

R.layout.activity_main
<RelativeLayout 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"> <EditText
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="200dp"
android:gravity="left" /> <Button
android:id="@+id/submit"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:text="提交" /> </RelativeLayout>
- Main2Activity
- @EActivity(R.layout.activity_main2)
- public class Main2Activity extends AppCompatActivity {
- @ViewById
- public TextView text;
- //获取intent里面的扩展值
- @Extra
- public String msg;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //@EActivity(R.layout.activity_main2)处已经setContentView
- //setContentView(R.layout.activity_main2);
- /**
- * 请关注Main2Activity_源码分析
- * 懂我的意思吗?
- */
- /*
- Main2Activity_类的定义
- public final class Main2Activity_ extends Main2Activity
- implements HasViews, OnViewChangedListener {*/
- /*
- Main2Activity_类的onCreate方法
- @Override
- public void onCreate(Bundle savedInstanceState) {
- ......
- super.onCreate(savedInstanceState);
- ......
- setContentView(R.layout.activity_main2);
- }*/
- }
- @Override
- protected void onStart() {
- super.onStart();
- text.setText(msg);
- }
- }

Main2Activity
@EActivity(R.layout.activity_main2)
public class Main2Activity extends AppCompatActivity { @ViewById
public TextView text; //获取intent里面的扩展值
@Extra
public String msg; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//@EActivity(R.layout.activity_main2)处已经setContentView
//setContentView(R.layout.activity_main2); /**
* 请关注Main2Activity_源码分析
* 懂我的意思吗?
*/
/*
Main2Activity_类的定义
public final class Main2Activity_ extends Main2Activity
implements HasViews, OnViewChangedListener {*/ /*
Main2Activity_类的onCreate方法
@Override
public void onCreate(Bundle savedInstanceState) {
......
super.onCreate(savedInstanceState);
......
setContentView(R.layout.activity_main2);
}*/
} @Override
protected void onStart() {
super.onStart(); text.setText(msg); }
}
此文件中,我为什么没有吧text.setText(msg);放在onCreate方法中,而放在了onStart中?你试试,根据错误排查。
- R.layout.activity_main2
- <RelativeLayout 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">
- <TextView
- android:id="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:textSize="30sp" />
- </RelativeLayout>

R.layout.activity_main2
<RelativeLayout 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"> <TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="30sp" />
</RelativeLayout>
代码使用部分,初略的贴出来了,有注释。 本文重点说配置,正确引导初学者。
http://blog.csdn.net/fesdgasdgasdg/article/details/51835461
Android Studio配置Android Annotations框架详解--说说那些坑的更多相关文章
- android studio配置android开发环境
1.下载安装android-studio-bundle 地址:https://developer.android.com/sdk/index.html 注意:指定android sdk和android ...
- android studio下的NDK开发详解(一)
源地址:http://www.voidcn.com/blog/chengkaizone/article/p-5761016.html 好记性不如烂笔头,开始坚持写博客,学一点记一点,只为了生活更好. ...
- Android Studio 2.2 新功能详解
Tamic /文 -译 http://blog.csdn.net/sk719887916/article/details/52672688 Android的Studio 2.2 已经可以在官网下载了. ...
- android studio配置AndroidAnnotations
现在很多人都使用Android studio开发工具代替eclipse了,当然的 在eclipse使用的好的一些开发框架也会对应的在android studio上面使用. 参考文档:http://bl ...
- Android开发:文本控件详解——TextView(一)基本属性
一.简单实例: 新建的Android项目初始自带的Hello World!其实就是一个TextView. 在activity_main.xml中可以新建TextView,从左侧组件里拖拽到右侧预览界面 ...
- Android开发工具Android Studio、Android SDK和Genymotion完全配置
所谓“工欲善其事,必先利其器”.Android Studio 是谷歌推出一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提 ...
- Android 广播大全 Intent Action 事件详解
Android 广播大全 Intent Action 事件详解 投稿:mrr 字体:[增加 减小] 类型:转载 时间:2015-10-20我要评论 这篇文章主要给大家介绍Android 广播大全 In ...
- Android零基础入门第13节:Android Studio配置优化,打造开发利器
原文:Android零基础入门第13节:Android Studio配置优化,打造开发利器 是不是很多同学已经有烦恼出现了?电脑配置已经很高了,但是每次运行Android程序的时候就很卡,而且每次安装 ...
- Android安卓书籍推荐《Android驱动开发与移植实战详解》下载
百度云下载地址:点我 Android凭借其开源性.优异的用户体验和极为方便的开发方式,赢得了广大用户和开发者的青睐,目前已经发展成为市场占有率很高的智能手机操作系统. <Android驱动开发与 ...
随机推荐
- html,css.javascript
基本标签(a.p.img.li.table.div.span).表单标签.iframe.frameset.样式 1:Html (Hypertext Markup Language) 超文本标记语言 ...
- 032 HDFS中高可用性HA的讲解
HDFS Using QJM HA使用的是分布式的日志管理方式 一:概述 1.背景 如果namenode出现问题,整个HDFS集群将不能使用. 是不是可以有两个namenode呢 一个为对外服务-&g ...
- Linux proc目录下 几个系统文件下的各项参数 (cpuinfo,uptime,meminfo,stat,loadavg)
参考链接: Linux 操作系统内核基本实验.pdf http://max.book118.com/html/2015/0919/25787869.shtm Linux下cpuinfo文件各项参数的详 ...
- Cube Stack
Cube Stack 有一点lazy思想,设三个数组cnt代表它以下的有多少个元素(直到栈底),top[x]代表x所在栈的栈顶元素,dad[x]代表x所在栈的栈底元素,先寻找父亲,然后递归更新累加cn ...
- 潭州课堂25班:Ph201805201 第九课 函数作用域和匿名函数 (课堂笔记)
匿名函数: lambda obj:str(obj).isdigit 语法规则: lambda 参数:表达式 列: ma1 = map( lambda obj:'binbin','abcdef' ) ...
- unity3d脚本语言中的引用类型
在之前的文文里有说到,值类型和引用类型,那么这会就单独说下引用类型: Unity3D中的C#语言提供了专门的类型来为开发者提供使用C#开发游戏的便利条件: 在该引擎中,使用UnityEngine命名空 ...
- 简单的三道shell例题
problem: 1. 输入一个ip列表文件,文件每行为以tab键分隔的两列,分别为一个ip段的起始ip和结束ip,ip均为点分形式.要求将该文件中各ip段包含的每一个有效ip以非点分形式输出到一个文 ...
- Linux学习笔记11—VSFTP的搭建
1.查看是否安装vsftp rpm -qa | grep vsftpd 如果出现vsftpd-2.0.5-21.el5,说明已经安装 vsftp 安装vsftp yum -y install vsft ...
- JVM内存管理--分代搜集算法
对象分类 分代搜集算法是针对对象的不同特性,而使用适合的算法,这里面并没有实际上的新算法产生.与其说分代搜集算法是第四个算法,不如说它是对前三个算法的实际应用. 首先我们来探讨一下对象的不同特性,接下 ...
- 解决IE9下交通银行网上银行无法输入密码的问题
自系统升级到 Win 7以后,突然发现用 IE9 浏览器登陆交通银行网上银行时,始终不能正常 输入密码.原来,非要进行特别的设置才可.现记录如下: 1.没有交通银行安装安全输入控件,安装即可. 当 ...