android注解使用詳解(圖文)
在使用Java的SSH框架的時候,一直在感嘆注解真是方便啊,關于注解的原理,大家可以參考我的另一片文章Java注解詳解。最近有時間研究了Android注解的使用,今天與大家分享一下。
android中注解的使用用到了GitHub上的開源框架androidannotations,-。這個開源框架應該是目前使用人數最多的android注解框架了,主要是由于它設計的注解標簽非常多,能夠滿足我們日常開發中的大部分需求。androidannotations將許多可以抽取出來的方法都包裝成了注解標簽供我們使用,一會我會給大家具體演示。
好了,言歸正傳,我們一起來看看怎么使用這個東東。
第一步
下載androidannotations
下載之后解壓文件,我們會看到有兩個jar包:
第二步
在eclipse上配置框架:
1.新建一個android項目,把androidannotations-api-3.2.jar拷貝到libs文件夾中,同時在項目中新建一個文件夾,叫做compile-lib,把androidannotations-3.2.jar文件拷貝進去。如圖:
2.選中項目,右鍵單擊,選擇Properties,在新窗口左邊可以看到Java Compiler,選中Java Compiler下的Annotation Processin,然后選中右邊的Enable project specific Settings,允許給項目一些特殊設置。如圖:
3.展開Annotation Processin,選中Factory Path,然后點擊右邊的Enable project specific Settings,最后點擊Add JARs,添加jar包。如圖:
4.選中我們剛剛新建文件夾中的jar包,一路點擊OK即可,如圖
好了,至此我們的開發環境上的配置就完成了
第三步
測試配置是否成功
在一個Activity上輸入@E,看看提示什么:
如果你看到了@EActivity,那么恭喜你,配置成功,如果沒有看到,請檢查以上步驟。
如圖:
第四步
配置好了,接下來我們就要看看怎么使用androidannotations了。
1.Activity注解的使用
修改清單文件中的activity配置,我們要在MainActivity后面添加一個_:
1
2
3
4
5
6
7
8
9
至于為什么要把MainActivity改為MainActivity_,我在后面會給大家解釋。然后在MainActivity上添加注解:
@EActivity(R.layout.activity_main) public class MainActivity extends Activity {
1
2
刪除掉onCreate()方法中的setContentView(R.layout.activity_main);,如圖:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }
1
2
3
4
為了方便起見,我們先在主布局文件中添加一些控件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
這個時候我們運行看看,在沒有給Activity設置布局的情況下系統有沒有報錯:
沒有崩潰,所有內容正常顯示,由此可見@EActivity(R.layout.activity_main)代替了setContentView(R.layout.activity_main);,這個使用起來更加方便。
再介紹一個和Activity有關的注解,我們在Activity使用過程中,經常需要重新自定義標題欄,從而需要隱藏系統默認的標題欄,那么這個該怎么實現呢:
@WindowFeature({ Window.FEATURE_NO_TITLE , Window.FEATURE_INDETERMINATE_PROGRESS}) @EActivity(R.layout.activity_main) public class MainActivity extends Activity {
1
2
3
效果圖:
標題欄成功隱藏,比我們其他的隱藏標題的方式都方便吧。
2.實例化控件注解
實例化控件注解是androidannotations中又一個非常好用的注解,也解決了我們開發過程中最枯燥的一項工作,正常情況下,我們實例化一個控件要使用findViewById,拿到控件后再強轉為我們需要的類型,代碼量大,而且枯燥,那么看看androidannotations帶給我們什么驚喜呢?
我們的主布局文件上一共有四個TextView,我使用以下三種方式來進行實例化:
@ViewById(R.id.textView1) TextView tv1; @ViewById TextView textView2; @ViewsById({R.id.textView3,R.id.textView4}) List
1
2
3
4
5
6
7
8
第一種:@ViewById(R.id.textView1)這是非常標準的寫法。聲明一個控件之后,然后使用@ViewById注解,在注解中說明這個控件的id,這樣相當于代替了這樣一行代碼:
TextView tv1 = (TextView) this.findViewById(R.id.textView1);
1
第二種:我沒有指明這個注解標簽要用的id,那么它是怎么實例化的呢?在沒有指明的情況下,androidannotations會使用控件名作為id,我的第二個控件名叫做textView2,與xml中的布局id是一樣的,因此可以不用在注解中指定id.
第三種:如果要聲明多個控件,可以把這些控件放入一個List集合中,然后在注解中指明多個id即可。
控件實例化之后,緊跟著就可以給控件賦值了:
@AfterViews public void initTextView(){ tv1.setText("hello world!"); textView2.setText("hello android annotations!"); for(TextView tv:list){ tv.setText("hello lenve!"); } }
1
2
3
4
5
6
7
8
這個方法會在實例完控件后執行。
3.事件注解
我們開發中用的較多的事件androidannotations幾乎都給我們提供了注解:
@TextChange @AfterTextChange @BeforeTextChange @EditorAction @FocusChange @CheckedChange @Touch @Click @LongClick @ItemClick @ItemLongClick @ItemSelect @OptionsItem @SeekBarProgressChange @SeekBarTouchStart @SeekBarTouchStop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
我這里挑個簡單的,也是最常用的說一下,算是拋磚引玉了:
@Click({R.id.button1,R.id.button2,R.id.button3}) public void btn_click(View v){ switch (v.getId()) { case R.id.button1: Toast.makeText(this,"btn1", Toast.LENGTH_LONG).show(); break; case R.id.button2: Toast.makeText(this,"btn2", Toast.LENGTH_LONG).show(); break; case R.id.button3: Toast.makeText(this,"btn3", Toast.LENGTH_LONG).show(); break; } } @Click(R.id.button4) public void btn4_click(){ Toast.makeText(this,"btn4", Toast.LENGTH_LONG).show(); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
在方法之上添加@Click注解,在注解中指明這是哪個控件的點擊事件,如果是多個事件的點擊事件,就注明多個id,在方法中使用v.getId()方法來進行區分。如果只給一個控件設置點擊事件,那看button4的例子。
事件的注解其實是比較簡單的,我就不多說了,大家有興趣可以查看官方文檔。
4.線程注解
這大概是最讓我激動的一個注解了。這里主要給大家介紹兩個注解:
@Background @UiThread
1
2
毫無疑問,@Background是讓方法在子線程中運行,而@UiThreaad則是讓方法在UI線程中運行。
我們來實現一個簡單的效果,點擊一個按鈕之后,讓一個TextView自動更新值。
@Background public void doInBackground(){ try { for (int i = 0; i < 100; i++) { tvShowNumber(i); Thread.sleep(1000); } } catch (InterruptedException e) { e.printStackTrace(); } } @UiThread public void tvShowNumber(int i) { list.get(1).setText(i+""); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
首先,在doInBackground方法中,每隔1秒執行一次tvShowNumber(i);方法,這個方法如果在主線程中運行會導致ANR異常,所以必須在子線程中運行,但是android中有不允許在子線程中更新UI線程,所以我們要在tvShowNumber方法上添加@UiThread標簽,表明該方法是在UI線程中運行的。
看看效果圖:
這里徹底拋棄了煩人的Message、Handler(此處該有掌聲)。
5.Activity之間傳值注解
Activity之間的跳轉經常需要數據的傳遞,在新的Activity中需要通過Bundle來獲得這些數據,還要判斷是否為空,非常麻煩,看看androidannotations是怎么解決這個問題的:
新建一個SecondActivity,注意要修改清單文件,在文件后面加上_:
1
2
3
4
SecondActivity接收MainActivity傳來的兩個參數,一個是name,一個是address,我們先來看看MainActivity中的代碼:
@Click(R.id.button5) public void go2NextActivity(){ //這里要注意第二個Activity的寫法 Intent intent = new Intent(this,SecondActivity_.class); intent.putExtra("name", "張三"); intent.putExtra("address", "xi'an"); startActivity(intent); }
1
2
3
4
5
6
7
8
在SecondActivity中獲得MainActivity中傳來的值:
@Extra("name") String username; @Extra String address;
1
2
3
4
和上文一樣,如果參數名相同,則不用在注解中說明參數名稱,否則要指明。這樣就自動拿到MainActivity中傳來的值了。如果MainActivity中傳來的值為空,也不會報錯,系統會自動處理異常情況。
6.資源文件注解
資源文件的使用我們也可以使用注解,比如,在strings.xml中添加一個字符串:
1
在程序中我們要引用這個值:
@StringRes(R.string.welcome) String welcome;
1
2
這樣welcome就自動獲得了這里的值。注意@StringRes導入的包是import org.androidannotations.annotations.res.StringRes;,不是android自帶的包,別上當了。
效果圖:
7關于加_的原因
最后再解決一個問題,就是什么要在清單文件中加_,要回答這個問題請大家先選中項目,右鍵單擊,取消apt_generated前面的一個點。
取消之后,我們的項目里多了一個文件夾:
這里的文件夾中的Activity就是我們剛才新建的Activity,只不過都多了一個下劃線,我們打開這些Activity看看:
我們通過注解寫的布局文件,它又在這里給我們生成了,所以說,我們最終編譯時用的是這里的文件,這也是為什么清單文件中要加下劃線了。
注意事項
最后強調一個注意事項,凡是使用注解的代碼,一定不要用private修飾最多可以用protected修飾,因為androidannotations在使用注解生成真正的源碼時,如果我們的東東被private修飾了,它就沒法調用這些東西了,所以最多只能用protected修飾。
關于androidannotations的更多用法大家可以參考官方文檔
好了,關于Androidannotations的使用就給大家介紹到這里,有什么問題請留言。本項目源碼下載。
Android HTTP
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。