1. 程式人生 > >Android註解框架Annotations從配置到應用

Android註解框架Annotations從配置到應用

最近在看一個新的基於註解開發的專案,瞭解到Android中同樣存在一些註解框架,能夠大大提高我們的編碼規範和效率,減少程式碼量。本文主要分為兩部分,針對較熱門的註解框架Android Annotations在Android Studio上的配置進行詳解。

Android Annotations配置

1.首先,一個框架需要有它的依賴包,Annotations框架需要使用兩個jar包,我已經上傳在了我的資源上,點此下載


2.在新建的普通專案裡面,新建一個compile-libs資料夾,將下載來的androidannotation-xx.jar新增到compile-libs資料夾下,將androidannotation-api-xx.jar新增到libs資料夾下

,如圖:


3.新增完依賴包之後,還要為其配置,在Project的build.gradle下的dependencies節點新增:
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4',如圖:


4.在Moudle的build.gradle下新增:
apply節點下:
apply plugin: 'android-apt'
def AAVersion = '3.2+'
-----------------------------------------------------------------------------
dependencies節點下:


apt "org.androidannotations:androidannotations:$AAVersion"
compile "org.androidannotations:androidannotations-api:$AAVersion"
compile 'com.android.support:support-v4:23.4.0'
------------------------------------------------------------------------------
新增一段apt:
apt {
    arguments {
        androidManifestFile variant.outputs[0].processResources.manifestFile
        resourcePackageName 'com.example.zjy.myapplication'
    }
}
如圖:



5.以上完成了基本的搭建,接下來還需要注意一點,AndroidAnnotations框架有一個特點,就是在編譯時會將我們的元件名後面加上一個下劃線,比如MainActivity就變為MainActivity_.class,所以如果我們要通過這個框架來進行開發,那需要在使用這些元件的時候都遵循這種規範,如圖,在AndroidMainfest.xml檔案中:


6.但是新增完之後你會發現專案報錯,識別不到xxxActivity_這個類名,那是因為還沒有編譯,需要將專案進行編譯,點選工具欄中的編譯按鈕(就圖案是010101,在選單欄Build下方的那個按鈕):


執行專案若報錯:
com.android.builder.packaging.duplicateFileException


則根據所指的重複檔案的路徑,將在build.gradle檔案的android節點中新增:
 packagingOptions {
        exclude 'META-INF/maven/org.androidannotations/androidannotations-api/pom.xml'
        exclude 'META-INF/maven/org.androidannotations/androidannotations-api/pom.properties'
        exclude 'androidannotations-api.properties'
 }

再次執行,完美通過。

Android Annotations應用

AndroidAnnotations的基本應用:

[email protected](R.id.xxx)

這是最為基本的一個註解,表示該類是一個Activity,並且對應於哪個佈局檔案
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

}


可以看到,我們沒有了onCreate方法,也沒有了setContentView方法,依然能夠執行出界面。

[email protected](R.id.xxx)

作用:相當於findViewById(R.id.xxx)。
在佈局檔案中定義一個按鈕:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    >

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>


在Activity中通過註解宣告該按鈕,注意按鈕要宣告為public不能為private:

@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

    @ViewById(R.id.btn)
    public Button btn;

}


[email protected](R.id.xxx)

作用:為該按鈕註冊監聽事件,表明該方法為該按鈕的點選事件方法
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

    @ViewById(R.id.btn)
    public Button btn;

    @Click(R.id.btn)
    void myClick(){
        Toast.makeText(this,"AndroidAnnotations",Toast.LENGTH_SHORT).show();
    }

}

還可以對多個button進行註解,再通過switch進行判斷:

@Click({R.id.button1,R.id.button2,R.id.button3})  
void buttonClicked(Button btn){  
    switch(btn.getId()){  
    case R.id.button1:  
	//這裡實現button1的點選事件  
        break;  
        ...  
    }  
} 


[email protected]

作用:只有所有View都注入完畢之後,才會執行該註解的方法,一般進行一些初始化的操作
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

    @ViewById(R.id.btn)
    public Button btn;

    @Click(R.id.btn)
    void myClick(){
        Toast.makeText(this,"AndroidAnnotations",Toast.LENGTH_SHORT).show();
    }

    @AfterViews
    void init(){
        btn.setText("按鈕注入完畢後才執行此方法");
    }

}


[email protected](String params)

作用:獲得其它地方跳轉過來時所傳遞過來的資料,括號中的字串即為傳遞過來的資料的key
如下例子:

MainActivity中:

Intent intent = new Intent(MainActivity.this,SecondActivity_.class);
Bundle bundle = new Bundle();
bundle.putString("hello","hello");
intent.putExtras(bundle);
startActivity(intent);

SecondActivity:

@EActivity(R.layout.activity_second)
public class SecondActivity extends Activity{

    @Extra("hello")
    String params;

    @AfterViews
    void init(){
        Toast.makeText(this,params,Toast.LENGTH_SHORT).show();
    }
}

跳轉的時候注意加下劃線:

Intent intent = new Intent(MainActivity.this,SecondActivity_.class);
startActivity(intent);


[email protected]和@UiThread

@Background作用:相當於用來進行後臺操作的方法(比如請求網路資源,操作檔案等等),被Backgroung註解的方法裡面不能進行任何UI操作,否則會報錯。
@Background
void httprequest(){
     //進行http操作
     //操作資料庫
     //操作檔案
}

@UiThread作用:相當於用來進行UI控制元件的操作,被UiThread註解的方法裡面不能進行任何後臺操作,否則會報錯

@UiThread
void runinUI(){
     Toast.makeText(this,"AndroidAnnotations",Toast.LENGTH_SHORT).show();
}

如何將兩者結合使用:

@AfterViews
void init(){
    httprequest();
}

@Background
void httprequest(){
    //進行http操作
    //操作資料庫
    //操作檔案

    //執行完後臺操作之後再執行UI操作
    runinUI();
}

@UiThread
void runinUI(){
    Toast.makeText(this,"UiThread",Toast.LENGTH_SHORT).show();
}


[email protected]

作用:用來標識該類是一個Fragment,並對應哪個佈局檔案
@EFragment(R.layout.layout_myfragment)
public class MyFragment extends Fragment{

}


[email protected]

作用:用來給當前Fragment接收別的地方傳來的資料
MainActivity中:
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

    @ViewById(R.id.btn)
    public Button btn;

    @Click(R.id.btn)
    void myClick(){
        MyFragment fragment = new MyFragment_();
        Bundle bundle = new Bundle();
        bundle.putString("hello","...");
	//設定傳遞的引數
        fragment.setArguments(bundle);
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.add(R.id.content, fragment);
        transaction.commit();
    }
}

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </FrameLayout>

</LinearLayout>

MyFragment類:

@EFragment(R.layout.layout_myfragment)
public class MyFragment extends Fragment{


    @FragmentArg("hello")
    String params;

    @AfterViews
    void init(){
        Toast.makeText(getActivity(), params, Toast.LENGTH_SHORT).show();
    }

}

layout_myfragment.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
</LinearLayout>


注意:FragmentArg括號中的引數要跟bundle所裝載的資料的key一致,才能接受到傳過來的資料。

以上介紹了比較常用的幾種註解,Annotaions框架還提供了很多其他的註解,如下:

@AfterInject 定義的方法在類的構造方法執行後執行

@AfterTextChange定義的方法在TextView及其子類的Text屬性改變後執行

@BeforeTextChange 定義的方法在TextView及其子類的Text屬性改變前執行

@EProvider 在 ContentProvider中啟用Annotations

@EReceive 在BroadcastReceiver中啟用Annotations

@EService 在Service中啟用Annotations

@EView 在自定義的View的子類中啟用Annotations

......等等,有興趣的朋友可以去看Annotations的官方API文件

總結:Annotations確實為我們的開發帶了許多方便,特別是在大型的專案下,不再需要一遍遍的findViewById,不再需要一遍遍地setContentView,同時另一方面又提高了程式碼的簡潔度和可讀性,所以相信其運用到實際開發中是非常有幫助的。


相關推薦

Android註解框架Annotations配置應用

最近在看一個新的基於註解開發的專案,瞭解到Android中同樣存在一些註解框架,能夠大大提高我們的編碼規範和效率,減少程式碼量。本文主要分為兩部分,針對較熱門的註解框架Android Annotati

Android】影象濾鏡框架GPUImage配置應用

GPUImage簡介 GPUImage 是iOS下一個開源的基於GPU的影象處理庫,提供各種各樣的影象處理濾鏡,並且支援照相機和攝像機的實時濾鏡。GPUImage for Android是它在Android下的實現,同樣也是開源的。其中提供了幾十多種常見的圖片濾鏡API,且

android框架實現短視訊應用、3D手勢旋轉、banner控制元件、指南針、智慧管家等應用原始碼

Android精選原始碼 android智慧管家app原始碼 Android高仿拼多多分類列表 Android百度地圖例項詳解之仿摩拜單車APP RecyclerView的LayoutManager搭建流式佈局 Android自定義View分享——一個圓形

android註解框架ButterKnife學習

最近學習了一個註解框架ButterKnife。地址:http://jakewharton.github.io/butterknife/,https://github.com/JakeWharton/butterknife/ 不同於其他的註解框架通過反射在程式碼執行階段實現對View的賦值和設

註解框架AndroidAnnotations4.5.2在android Studio 3.0之後的配置

注意:這是android Studio 3.0之後的配置(關於 android studio 即可檢視版本) 在module的build.gradle中根據以下紅色字型來進行配置 第一步:1.新增下面這一段到defaultConfig下面 javaCompileOp

Android Studio3.0 配置AndroidAnnotation註解框架

前言android學習了一段時間後,想要開發一款App,但是一些複雜的程式碼寫多了實在麻煩,就到網上找了找簡便的方法,於是在眾多的註解開發框架中,找到了Android Annotation這個框架,這裡

遊戲UI框架設計(五): 配置管理與應用

oid per b- 測試 中心 序列化對象 ner stun sage 遊戲UI框架設計(五) --配置管理與應用 在開發企業級遊戲/VR/AR產品時候,我們總是希望可以總結出一些通用的技術體系,框架結構等,為簡化我們的開發起到“四兩撥千金”的作用。所謂“配

理解Android的handler機制--應用到原理再到實踐

關於Android的多執行緒機制,面試的時候總是問到,今天專門寫這個部落格,目的是把handler說清楚。 分別從下面四個方向說清楚。   由來 問題:為什麼有handler? 我們知道java是支援多執行緒的,而一個APP只有一個UI(即螢幕只有一個),如果每個執行緒

Tomcat(一) Tomcat是什麼:Tomcat與Java技術 Tomcat與Web應用 以及 Tomcat基本框架及相關配置

轉載自:http://blog.csdn.net/tjiyu/article/details/54590259 Tomcat(一) Tomcat是什麼: Tomcat與Java技術 Tomcat與Web應用 以及 Tomcat基本框架及相關配置  &nb

Android 自己打造IOC註解框架

Android中IOC框架就是注入控制元件和佈局或者說是設定點選監聽,網上有很多成熟的註解框架例如xUtils,afinal,butterknife等等。你可能會問,既然已經有好的框架為何還要造輪子?因為,首先我是學習,學習框架的設計以及實現,其次是拓展,適合自己的輪子才是好輪子,所以我

詳解Spring框架註解掃描開啟之配置細節

今天通過做的一個結合ssh的crm專案,最後用到了spring註解配置,最後需要開啟配置,查找了很長時間,找了一篇比較有質量的部落格文章,就轉載過來,希望能夠給與大家一定幫助,另外也希望博主的文章有更多的人看到。 原文地址:https://blog.csdn.net/u014427391/art

Android-volley淺談-原始碼去了解它為什麼是Google推薦的網路請求框架

今天想總結的是Volley這個網路請求框架,雖然volley論火爆程度比不上okhttp和retrofit 這兩個,並且在日常使用的過程中可能很少有人能去深究為什麼volley是Google 所推薦的網路框架,不管從使用還是從原始碼去理解,我覺得volley都是一款值得去深究

關於Android App上線後應用市場點選開啟按鈕進入應用後進行操作後,再點選home鍵到桌面後點擊啟動圖示重新開啟應用的解決方法

如題所述,重新開啟應用夠噁心的了,讓人更噁心的是點選返回鍵退出後,上次點選home鍵之前的那個介面又跳出來,讓人哭笑不得,經過搜尋找到解決辦法,最後記錄在此 在應用啟動的第一個介面的onCreate方法的super.onCreate(savedInstanceState);之後呼叫下面方法

Android ORM 框架Android中ORMLite應用基礎

ORMLite是常用的一個ORM框架,她不止可以用在Android的sqlite資料庫,也可以使用她操作其他常見的資料庫。這兒是根據官方文件抽取來的android用法。 一,新增依賴 匯入ormlite-core.jar和ormlite-android.

Android UI註解框架 ButterKnife原始碼及原理分析

很開心,今天看到了一篇大神寫的部落格,對ButterKnife進行原始碼原理分析!看完之後學習到了很多新的知識,有關於自動生成程式碼的原理,以後有機會要自己寫一個註解框架!哈哈,如果能力夠的話! 簡單介紹一下 ButterKnife是一個很不錯的View

Android Studio上方便使用butterknife註解框架的偷懶外掛Android Butterknife Zelezny

首先提下ButterKnifey已經更新到版本7.0.1了,現在註解已經不叫@InjectView了,而叫@Bind,感覺更貼合語義。同時註冊的方式也從 ButterKnife.inject(this); 變成了 ButterKnife.bind(this); 關於

Android面試題-註解框架實現原理

本文配套視訊 配套視訊 原始碼分析相關面試題 與XMPP相關面試題 與效能優化相關面試題 與登入相關面試題 註解框架實現原理,手寫ButterKnife實現自己的註解框架 初級程式設計師使用別人的框架,中級程式設

cocos2dx 3.12在android studio上配置到真機執行

官網的配置連結:   好吧,有人肯定說著官網不是有很好的配置文件嗎,照著弄不就好了,要你何用?曾幾何時我也像這麼單純,然後就是各種悲劇,配置過程中出現了不少問題,導致走了很多彎路,這裡主要就是把其中遇到的彎路備份下來,免得下次配置的時候又出現同樣的問題。   首先是Ja

Spring4.X + Spring MVC + Mybatis3 零配置應用開發框架搭建詳解 (3)

Spring4.X + Spring MVC + Mybatis3 零配置應用開發框架搭建詳解(3) - 實現最基本的登入處理 1. 基本架構:         基礎框架搭建完成後,我們開始進行Spring + SpringMVC + Mybatis的整合,來完成登入功能的

android如何一個應用跳轉到另一個頁面

眾所周知,在一個APP內部,從一個頁面跳轉到另外一個頁面是使用startactivity函式來實現的。 同樣的,對於應用之間的跳轉也是如此的。應用直接的跳轉分為三種情況,為了方便描述,我加上有兩個應用A和B,需求是要從A點選一個按鈕,可以跳轉到B,同時A要傳資料給B,B能夠