AndroidAnnotations框架的部署及实现过程,及AndroidStudio3.0以上集成时无法编译,碰到的天坑的解决方式

 

昨天和一个好哥们一起探讨了一下AndroidAnnotations这个框架,发现网上面好多的博客都无法实现,因为在使用AndroidAnnotations需要在android studio上配置环境,很是有些麻烦。

  在使用完AndroidAnnotations后,我感觉对eventBus, Butterknife都没有好感了,因为AndroidAnnotations这个框架实在是太好用了,现在就将配置过程放在下面;

 

实现AndroidAnnotations这个框架,所以新建一个工程,在新建的工程下面,我们进入Project的目录查看方式

 

 

大家可以看到上图有两个build。gradle 文件,一个是在app文件夹下,一个是在MyApplication下的build。gradle,那么下面就要在这两个build.gradle下面做文章了,

首先打开MyApplication下的build。gradle我们需要在

 

dependencies {
    classpath 'com.android.tools.build:gradle:2.1.0'
    

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

 

 

 

中插入代码

 

 


    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

最后效果:

dependencies {
    classpath 'com.android.tools.build:gradle:2.1.0'
   //在此处插入gradle配置目前最高是1.8版本,
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

 

这样MyApplication下的build.gradle文件就配置完了,配置好的MyApplication中的build.gradle完整代码:

 

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

 

 

 

 

 

 

 

再来配置app下的build.gradle:

打开build.gradle:

加入

 

apply plugin: 'android-apt'
def AAVersion = '4.0.0'

这段代码在任意地方都可以放,但是不要放在括号内;

 

接着还要加入:

 

apt {
    arguments {
        androidManifestFile variant.outputs[0]?.processResources?.manifestFile
       //这里一定要放你自己的包名
        resourcePackageName "com.example.administrator.myapplication"
    }
}

加入规则与上面是一致的;

 

然后在dependencies中需要加入两行代码

 

apt "org.androidannotations:androidannotations:$AAVersion"
compile "org.androidannotations:androidannotations-api:$AAVersion"

加入后的效果如下:

 

 

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.0.0'
    //此处为加入后的代码
    apt "org.androidannotations:androidannotations:$AAVersion"
    compile "org.androidannotations:androidannotations-api:$AAVersion"
}

 

 

 

这样我们的环境配置就算是完成了,配置好的app中的build.gradle完整代码:

 

apply plugin: 'com.android.application'

apply plugin: 'android-apt'
def AAVersion = '4.0.0'



android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"

    defaultConfig {
        applicationId "com.example.administrator.myapplication"
        minSdkVersion 15
        targetSdkVersion 24
        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:24.0.0'

    apt "org.androidannotations:androidannotations:$AAVersion"
    compile "org.androidannotations:androidannotations-api:$AAVersion"
}


apt {
    arguments {
        androidManifestFile variant.outputs[0]?.processResources?.manifestFile
        resourcePackageName "com.example.administrator.myapplication"
    }
}

 

 

 

 

然后还需要点击如下图的按钮,进行重新buiild

 

 

重新build后  如果报错,我们试着将AndroidManifest.xml中的所有的Activity后面都加上下划线,如下:

 

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.administrator.myapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
              //注意看:MainActivity_;跟原来的不一样哦,后面的Activity都一样的
         <activity android:name=".MainActivity_">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

//注意看:MainActivity_;跟原来的不一样哦,后面的Activity都一样的

  <activity android:name=".Main2Activity_"></activity> </application></manifest> 加完后继续build试试,但是有时候还是会出错,可以尝试一下运行程序,最好在程序新建的时候,搭配环境就直接运行一次,只要运行成功了就没问题。然后再做后面的功能实现

 

配置了AndroidAnnotations框架的后 我们就可以开始使用注解了:如下

原来的Activity中onCreate中是这样的

 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
}

有了AndroidAnnotations框架。后我们就不用这样了

 

注意看下面的代码:

 

 

package com.example.administrator.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;

import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;

@EActivity (R.layout.activity_main)



public class MainActivity extends AppCompatActivity {
    @ViewById
    EditText editview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      //  setContentView(R.layout.activity_main);
    }

@Click
    public void jump_button(View view) {
    Main2Activity_.intent(this).extra("msg", editview.getText().toString()).start();
}

}

 

 

 

在我的代码中

 

 

@ViewById
    EditText editview;

是注册EditText这个控件

 

 

@Click
    public void jump_button(View view) {
    Main2Activity_.intent(this).extra("msg", editview.getText().toString()).start();
}

这段代码的功能是:当按下按钮时将第一个Activity中的EditView中的内容发送到第二个页面去,并且跳转到第二个页面,注意看我并没有用StartActivity,而是用的这个方法

 

 

 Main2Activity_.intent(this).extra("msg", editview.getText().toString()).start();

 

这样就跳到第二个界面去了,注意看我第二个activity中的代码:

 

 

package com.example.administrator.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Extra;
import org.androidannotations.annotations.ViewById;

@EActivity(R.layout.activity_main2)
public class Main2Activity extends AppCompatActivity {
    @Extra
    public String msg;
    @ViewById(R.id.textview)
    public TextView textview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //  setContentView(R.layout.activity_main2);
    }

    @Override
    protected void onResume() {
        super.onResume();
        textview.setText(msg);
    }
}

 

 

 

这样我们的AndroidAnnotations这个框架就搭建成功了,本文主要讲解集成

AndroidAnnotations框架,对于使用不做过多的叙述。

具体应用还需要多研究,原始框架的github地址在:
https://github.com/excilys/androidannotations

 

程序实例下载:点击打开链接

************************************************************************************************

更新部分

关于支持到AndroidStudio3.0以上遇到的大坑:

相关配置 app上 的build.gradle

def AAVersion = '4.5.2' //保持最新版本,不然可能会编译不了//https://github.com/androidannotations/androidannotations/wiki右上方查看版本
android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.zs.androidannotationstest"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        // 添加下面这一段到defaultConfig下面
        javaCompileOptions {
            annotationProcessorOptions {
                //这里的包名和applicationId一致
                arguments = ['resourcePackageName': "com.example.zs.androidannotationstest"]
            }
        }

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    annotationProcessor "org.androidannotations:androidannotations:$AAVersion"
    implementation "org.androidannotations:androidannotations-api:$AAVersion"

}

MyApplication下的build。gradle下的配置:

 

 

 

 

buildscript {
    
    repositories {
        jcenter()
        google()
        mavenCentral()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        mavenLocal()
        mavenCentral()


    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

 

在编译过程中会出现:

Compilation failed; see the compiler error output for details.

这句话,点击左边最下面红色小点点那一行可以看具体出现问题的地方:

The AndroidManifest.xml file contains the original component, and not the AndroidAnnotations generated component. Please register Main2Activity_ instead of Main2Activity

似乎好像是AndroidManifest里面没有注册Main2Activity_这个鬼;

在AndroidManifest里面确实也没有生成这个鬼东西:

如果我们手动添加会怎样?

 

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    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"></activity>
    <activity android:name=".Main2Activity_"></activity>
</application>

 

很明显,没有这个东西,添加进去后这个activity不存在,这时候我们在重新编译一下:

编译后就好了,程序也可以正常执行了;

这就是Androidstudio升级到3.0以上集成的方式,看起来还是很坑的一个框架啊

这就是Androidstudio升级到3.0以上集成的方式,看起来还是很坑的一个框架啊

这就是Androidstudio升级到3.0以上集成的方式,看起来还是很坑的一个框架啊

这就是Androidstudio升级到3.0以上集成的方式,看起来还是很坑的一个框架啊

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章