細說 Android Annotations 註解框架
Hello 大家好,我是劉某人
註解不是必須的,但是能極大的幫助我們節約時間和提高開發效率,寫此篇文章的初衷,是我課程中的同學想要了解一下這個框架,遂寫下此篇文章,其實我們如果想了解Annotations這個框架的話,他的官方示例寫得還是比較詳細的:
官網:
文件:
如果你學習我的影片課程,哪怕課程之外的知識點,如果有時間,我也會幫助你提升的,授人予魚不如授人予漁,我時刻都在培養同學的思維邏輯,只要哪天開竅了,一切都變得簡單明瞭了。
推薦我的慕課網Android實戰課程,助你暴力提升Android技術。
相對於其他的註解框架,如XUtils、ButterKnife、Dragger等,Annotations的優勢在於沒有使用到反射,不影響效能,所以如果論效能,Annotations應該是最好的。
不過據說Google官方推出註解框架之後,Annotations的作者就不在更新了。
不過不得不說Annotations的配置要麻煩許多,所以我建議如果不是必須的話,這個還是少用一些,不然重構程式碼比較麻煩,當然,我現在說這些,對於沒有用過Annotations的同學來講,可能還不太理解,跟著我一起來看下吧。
首先我們來配置一下所需的Gradle,配置Gradle分為兩步,第一步是新增依賴
可以看到我定義了一個變數AAVersion來定義版本,第二步則是新增Java編譯的配置:
我們在defaultConfig節點中配置如上程式碼是因為Annotations的編譯不像其他框架一樣反射,而是透過生成一份子類程式碼來幫助執行,所以找不到清單檔案,我們自己配置下即可。
當然,這個時候還是無法執行的,上面說到Annotations的編譯是生成一份子類,所以我們的清單檔案也需要修改,在每一個宣告的類中加上下劃線,如下程式碼:
做完這些,我們的配置才OK,那麼接下來就看下我們怎麼使用吧。
Annotations對Android中一些重量級的元件都做了增加,我們來看下
1.Activity
首先是如何宣告一個Activity的View,傳統的寫法是setContentView,但是有了Annotations之後,我們可以使用@EActivity這個標籤
@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
//Anything
}
2.Application
關於Appliation,是必須要使用@EApplication這個標籤的
@EApplication
public class BaseApp extends Application {
//Anything
}
然後則是在清單檔案中註冊了,記得加上下劃線哦
如果想要使用的話,需要使用@App標籤
@App
BaseApp mApp;
具體的可以查閱Github wiki
3.Bean
關於實體類,我們可以使用@EBean
@EBean
public class JavaBean {
//Anything
}
如果想要使用的話,需要使用@Bean標籤
@Bean
JavaBean mBean;
具體的可以查閱Github wiki
4.Fragment
關於Fragment就有意思了,首先我們需要使用@EFragment來註解,這個是沒問題的,和@EActivity的用法是一樣的
@EFragment(R.layout.fragment_main)
public class MainFragment extends Fragment {
//Anything
}
這樣我們就不需要再呼叫onCreateView了,當然如果你想使用到onCreateView中的Bundle那麼你直接return null 即可,說完註解,我們再來說一下使用,使用是需要下劃線的,比如我們在xml中則是如下:
如果是在程式碼中,則可以使用下面兩種任選其一:
MainFragment mFragment = new MainFragment_();
//or
MainFragment mFragment = MainFragment_.builder().build();
5.Provider
內容提供者倒是沒什麼太大的區別,使用@EProvider註解即可。
6.BrocastReceiver
廣播的話分為動態廣播和靜態廣播,動態註冊最為簡單
@Receiver(actions = TEST_ACTION)
protected void test() {
//收到廣播
}
我們可以看到只需要透過@Receiver註解標記需要接收的actions即可,而靜態廣播如下
@EReceiver
public class JavaReceiver extends BroadcastReceiver {
//可以接收Context,Intent 兩個引數
@ReceiverAction(actions = MainActivity.TEST_ACTION)
void test() {
//收到廣播
}
@Override
public void onReceive(Context context, Intent intent) {
//什麼都不用做
}
這裡我們也是一樣的,我定義了一個test,並且你也可以自己傳遞上下文或者intent
7.Service
服務的話有兩個,一個IntentService和一個Service,我們先來看下IntentService
@EIntentService
public class MainIntentService extends IntentService {
public MainIntentService() {
super("MainIntentService");
}
@ServiceAction
void myAction(String param) {
//接收引數
}
@Override
protected void onHandleIntent(Intent intent) {
//什麼都不做
}
程式碼很簡單,我們使用@EIntentService註解來標記,使用@ServiceAction註解來接收傳遞的引數,再來看下我們常見的Service,其實只是使用了@EService註解,我們具體看下他的啟動和停止的方法吧。
//啟動服務
MainService_.intent(this).start();
//停止服務
MainService_.intent(this).stop();
8.View
View的情況實際上也是兩種,一種是View,一種是ViewGroup,如果是View的話只需要@EView註解即可
當然,使用的方式也分兩種,xml或者程式碼,先看xml
<com.liuguilin.androidannotations.view.MyTextView_
android:text="MyTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
xml包括清單檔案中一定要注意下劃線,在程式碼中可以這樣
MyTextView mTextView = MyTextView_.build(this);
如果是ViewGroup的話使用@ViewGroup(R.layout.xxx)
具體的可以查閱Github wiki
關於注入的註解關鍵字,其實上面已經有講到一些了,比如@App @Bean 等都是,我們繼續來看其他的基本操作
1.ViewById / ViewsById
這兩個都是負責初始化的,相信大家一眼就知道什麼意思,替代我們的findViewById
@ViewById(R.id.mTextView)
TextView mTextView;
@ViewsById({R.id.mTextView, R.id.mYourTextView})
List<TextView> mTextViews;
2.Extra
擴充套件屬性,常用於Intent的擴充套件,說白了就是intent的傳值,所以我們可以這樣使用,這裡我的案例是MainActivity跳轉FirstActivity,所以我們的FirstActivity可以這樣區寫:
@EActivity(R.layout.activity_first)
public class FirstActivity extends AppCompatActivity {
@ViewById(R.id.tvFirst)
TextView tvFirst;
@Extra("Name")
String mName;
@AfterViews
void initView() {
tvFirst.setText(mName);
}
可以看到程式碼還是很明朗的,我初始化了一個文字控制元件然後接受外部傳遞的mName設定給文字,那麼外部是如何呼叫的?
FirstActivity_.intent(this).mName("劉桂林").start();
一行程式碼即可。
3.AfterViews
我們如果使用ViewById初始化後,在onCreate使用這個物件你會發現是無法使用的,事實上這個時候還沒有初始化,AfterViews就是用來告知我們試圖已經初始化完成,我們標準的寫法是這樣的:
@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
@ViewById(R.id.mTextView)
TextView mTextView;
@AfterViews
void init(){
mTextView.setText("Hello");
}
4.FragmentArg
顧名思義,這個是在Fragment中使用的,並且看名字就知道是什麼意思了,首先是@FragmentArg,這個註解和@Extra是一樣的,用來傳遞引數
MainFragment mFragment = MainFragment_
.builder()
.fragmentArg("Hello")
.build();
至於 FragmentById / FragmentByTag 這些不常用的可以自行查閱wiki
5.FromHtml
假設你的strings.xml中有一個html的引數,那麼常見的做法是使用Html類去轉換成String再賦值給TextView,而使用@FromHtml則無需這麼複雜,我們來看下
<string name="hello_html"><![CDATA[Hello <b>World</b>!]]></string>
這是一段html,我們來載入
@ViewById(R.id.mTextView)
@FromHtml(R.string.hello_html)
TextView mTextView;
這樣即可。
6.NonConfigurationInstance
這也是個相對冷門的註解了,當我們的Config配置發生更改,比如切換語言的時候,我們的物件會銷燬重建,但是使用此註解可以儲存例項
7.SystemService
我們如果需要getSystemService初始化的系統服務都可以使用此註解免去這一個步驟。
1.Text 變化
如果我們要監聽EditText的輸入文字改變,則需要實現他的TextWatcher.onTextChanged介面,但是註解框架為我們提供了諸多方便的介面,如:
- TextChange
- BeforeTextChange
- AfterTextChange
看如下程式碼:
@AfterTextChange(R.id.mEditText)
void afterTextChanged(Editable text) {
//開始改變
}
@TextChange(R.id.mEditText)
void onTextChanges(CharSequence text, int before, int start, int count) {
//正在改變
}
@BeforeTextChange(R.id.mEditText)
void beforeTextChanged(CharSequence text, int start, int count, int after) {
//結束改變
}
其中引數除了text其他的都是可選項
2.狀態 變化
狀態變化主要取決於焦點以及編輯狀態,還有選中,我們可以使用 @FocusChange @EditorAction @CheckedChange
3.事件 監聽
事件監聽就很多了,比如我們的點選事件,觸控事件,長按事件等
@Click(R.id.mClick)
void BttonClick() {
//點選事件
}
@LongClick(R.id.mClick)
void BttonLongClick() {
//長按事件
}
@Touch(R.id.mClick)
boolean BttonTouchClick(MotionEvent event) {
//觸控事件
return false;
}
當然,我們還有Adapter中的事件監聽,如 @ItemClick @ItemLongClick @ItemSelect
還有我們的menu其實也是可以這樣設定點選的,我們來看下如下程式碼
@OptionsMenu(R.menu.main)
@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
@OptionsItem(R.id.menu_help)
void Help() {
//Anything
}
}
這樣即可實現menu與menu的點選事件
4.SeekBar 監聽
以往我們監聽SeekBar是需要設定監聽的,現在不用啦。
@SeekBarTouchStart(R.id.mSeekBar)
void SeekBarTouchStart(SeekBar seekBar) {
//觸控開始
}
@SeekBarProgressChange(R.id.mSeekBar)
void onProgressChangeOnSeekBar(SeekBar seekBar, int progress, boolean fromUser) {
//觸控變化
}
@SeekBarTouchStop(R.id.mSeekBar)
void SeekBarTouchStop(SeekBar seekBar) {
//觸控結束
}
5.按鍵 事件
按鍵共有四個
- KeyDown 按下
- KeyUp 抬起
- KeyLongPress 長按
- KeyMultiple 多按
6.ViewPager 監聽
ViewPager監聽以往是需要addPageListener的,現在提供了三個註解
- PageScrollStateChanged
- PageScrolled
- PageSelected
1.後臺執行緒
我們如果想要在子執行緒中執行,以往都是new Thread().start的,現在只需要@Background
即可,它表示在主執行緒以外的執行緒執行
2.主執行緒
主執行緒也就是ui執行緒,我們使用@UiThread註解,代替 runUIThread方法
其他還有很多,我們來看下
- InstanceState 儲存狀態
- WindowFeature 視窗功能
- Fullscreen 全屏
- CustomTitle 自定義標題
- InjectMenu 注入選單
- OptionsMenu 選單
- OptionsMenuItem 選單Item
- OrmLiteDao 資料庫
- RoboGuice
- Trace 日誌條目
- Transactional 資料庫事務任務
- OnActivityResult Activity回撥
- OnActivityResult.Extra Activit回撥擴充套件值
- HierarchyViewerSupport
- ServiceAction 服務訊號
- Receiver 廣播
- Receiver.Extra 廣播擴充套件值
- ReceiverAction 廣播訊號
- ReceiverAction.Extra 廣播訊號擴充套件值
- IgnoredWhenDetached
- IgnoreWhen
- WakeLock 鎖屏
- DataBound 資料繫結
- StringRes 字串
- AnimationRes 動畫
- ColorRes 顏色
- DimensionPixelOffsetRes 數字
- DimensionPixelSizeRes 數字
- DimensionRes 數字
- BooleanRes 布林
- ColorStateListRes 顏色狀態
- DrawableRes 圖片
- IntArrayRes 整型陣列
- IntegerRes 整型
- LayoutRes 佈局
- MovieRes 電影
- StringArrayRes 字串陣列
- TextArrayRes 文字陣列
- TextRes 文字
- HtmlRes 網頁
到這裡,其實大部分常用的Api都已經有所講解了,不過在實際開發中可能還會有一些需要注意的事項,不過不用擔心,多看下wiki即可,國內的部落格領域比較凌亂,其實很難找到實用的東西,所以需要自己耐心一點,當然還有Rest Api ,Typesafe SharedPreferences,Preference API helpers 這些就不講了,感興趣的可以看下Github wiki,一法通萬法,掌握了學習知識的技巧,很多東西哪怕不瞭解,摸索一下也能快速上手的。
原始碼下載
連結:
密碼:t35a
推薦我的慕課網Android實戰課程,助你暴力提升Android技術。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2471/viewspace-2824447/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Entity Framwork Core 資料註解(Data Annotations)使用方法
- 整合測試——Spring TestContext框架支援詳細解說SpringContext框架
- Android編譯時註解框架系列1-什麼是編譯時註解Android編譯框架
- 註冊帶有Annotations標記的SchemaOL
- Mybatiss 框架解說MyBatis框架
- spring 框架常用註解Spring框架
- Android原生註解整理Android
- SpringBoot註解大全(詳細)Spring Boot
- Java註解在Android中必須學習的細節知識JavaAndroid
- [Android開源框架]RxHttp使用說明Android框架HTTP
- Java ”框架 = 註解 + 反射 + 設計模式“ 之 註解詳解Java框架反射設計模式
- Spring 框架快取註解Spring框架快取
- 註解的詳細介紹
- Android開源框架如何說-Gilde4Android框架
- SpringMVC的@ResponseBody註解說明SpringMVC
- spring框架半自動註解Spring框架
- 淺談Android下的註解Android
- Android 註解系列之Annotation(二)Android
- Spring @Conditional註解 詳細講解及示例Spring
- Java註解最全詳解(超級詳細)Java
- Spring原始碼系列:註解說明Spring原始碼
- Swagger2常用註解說明Swagger
- Spring的@Qualifier註解使用說明Spring
- nginx 詳解 - 詳細配置說明Nginx
- nginx 詳解 – 詳細配置說明Nginx
- SpringBoot註解最全詳解(整合超詳細版本)Spring Boot
- Android 註解系列之APT工具(三)AndroidAPT
- Android MVVM探索(二) - DataBiding常用註解AndroidMVVM
- 13.Android之註解問題Android
- [獻醜了!] Android AOP註解GoodAtAndroidGo
- 阿里巴巴fastjson @JSONField 註解說明阿里ASTJSON
- springboot的註解的作用說明(全)Spring Boot
- Android BLE藍芽詳細解讀Android藍芽
- winscp操作說明,winscp操作說明的詳細解讀
- workerman 框架原始碼核心分析和註解框架原始碼
- Spring框架裡註解@Autowired的工作原理Spring框架
- 深入學習Spring框架(二)- 註解配置Spring框架
- Android 9.0 BufferQueue中的BufferSlot/BufferState註解Android