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以上集成的方式,看起來還是很坑的一個框架啊

 

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