Android studio配置androidannotations最好的配置说明(转载)

来源:互联网 发布:it学校 编辑:程序博客网 时间:2024/06/04 23:26

本文转载自:传送门


原文内容:


我们开发过程中都需要写些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' 


这个地方的版本号是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: '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这部分是需要查找和解析androidManifestFile文件吧!切记,需要注意的地方

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"

两句,引用上面的版本号,貌似也可直接把$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>  

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>  

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>

代码使用部分,初略的贴出来了,有注释。
本文重点说配置,正确引导初学者。