精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android注解式綁定控件

移動開發 Android
Android開發中,有一個讓人又愛又恨的方法叫findViewById(int);我想如果你是一民Android開發者,必然知道這個方法。 那么為什么讓人又愛又恨呢?想必大家也是很有感觸。

Android開發中,有一個讓人又愛又恨的方法叫findViewById(int);我想如果你是一民Android開發者,必然知道這個方法,讓我們來看一下KJFrameForAndroid框架是如何解決這個問題的。

KJFrameForAndroid框架項目地址:https://github.com/kymjs/KJFrameForAndroid。

為什么說findViewById(int);讓人又愛又恨呢?想必大家也是很有感觸。
寫一個布局,用Java代碼寫和用xml文件寫,完成速度完全是無法比擬的。xml布局太方便了。
同樣的,想獲取一個控件的對象,如果你是使用的xml布局文件寫的布局,那么你必須調用findViewById()這個方法。

  1. TextView t = (TextView) findViewById(R.id.x); 

這是我們最常見的 獲取xml布局中一個textview對象的過程。
那么問題就來了,這特么奇葩的方法名也太長了吧!??!好吧,其實人家名字起的也沒有錯,要描述清楚這函數的含義,也必須這么多個字母。
可是你丫的返回一個View讓我用的時候還得強轉,這也太麻煩了吧。我一行代碼總共也就100列(Eclipse默認),縮進八格(方法寫在類里面,語句寫在方法里面),
就算像上面的例子textView對象只有一個字母,id也只有一個字母,這一個初始化也要占我54列了。要是變量名再長點,縮進層次再深點,這一個初始化就兩行了。
一個界面至少也有四個控件吧,這么復雜的初始化,太坑爹了。
有問題總會有對應的解決辦法,下面我就向大家介紹一下使用注解解決這種麻煩。
了解注解:

從jdk1.5開始,Java提供了注解的功能,允許開發者定義和使用自己的注解類型,該功能由一個定義注解類型的語法和描述一個注解聲明的語法,讀取注解的API,一個使用注解修飾的class文件和一個注解處理工具組成。
首先,你需要接受一個關鍵字@interface ,噢,它可不是接口定義關鍵字,更不是OC里面的@interface關鍵字,是Java中表示聲明一個注解類的關鍵字。
使用@interface 表示我們已經繼承了java.lang.annotation.Annotation類,這是一個注解的基類接口,就好像Object類,現在你只需要知道它的存在就行了。
還有一條規定:在定義注解時,不能繼承其他的注解或接口。
那么,這就是最簡單的一個注解類

  1. public @interface MyAnnotation { 
  2.   

然而通常在使用時我們都會給這個注解類加上兩個注解:

@Target(ElementType.FIELD)、@Retention(RetentionPolicy.RUNTIME)
ElementType、RetentionPolicy是兩個枚舉類,ElementType.FIELD表示我們需要注解的是一個字段,以下是摘自JDK1.6文檔中的介紹:

使用注解:

以下為KJFrameForAndroid框架中綁定控件注解部分的定義與使用

  1. @Target(ElementType.FIELD) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. public @interface BindView { 
  4.     public int id(); 
  5.     public boolean click() default false
  6. }
  7. @BindView(id = R.id.x, click = true
  8. private TextView t; 

我們可以看到,除了明顯減少了代碼量,還使得代碼結構更加清晰。
其中,定義部分的id() 表示注解接受一個int類型的數據作為id所對應的值(就如使用中的id = R.id.xxx);
同理,定義部分的click表示接受一個Boolean類型的數據作為click對應的值,還可以設置一個默認值使用default修飾;
處理注解:

我們已經知道了注解怎么定義和使用,接下來就應該知道怎么處理了。
上面已經說了,bindview注解可以接受一個int類型的值和一個Boolean類型的值,那么這兩個值接受了以后如何獲取呢?
其實獲取的方式很簡單就是通過一個BindView類型的對象,調用這個對象來自聲明中定義的兩個方法——>id()或click()方法。
現在就有一個問題了,注解類型是不能直接new對象的,那么這個BindView對象從哪里來呢?
這時就需要用到Java的反射機制。我們知道,每一個繼承自Object類的類都會繼承一個getClass()方法,下面看一下這個方法的原型:

  1. /** 
  2.     * Returns the unique instance of {@link Class} that represents this 
  3.     * object's class. Note that {@code getClass()} is a special case in that it 
  4.     * actually returns {@code Class<? extends Foo>} where {@code Foo} is the 
  5.     * erasure of the type of the expression {@code getClass()} was called upon. 
  6.     * <p> 
  7.     * As an example, the following code actually compiles, although one might 
  8.     * think it shouldn't: 
  9.     * <p> 
  10.     * <pre>{@code 
  11.     *   List<Integer> l = new ArrayList<Integer>(); 
  12.     *   Class<? extends List> c = l.getClass();}</pre> 
  13.     * 
  14.     * @return this object's {@code Class} instance. 
  15.     */ 
  16.    public final native Class<?> getClass(); 

是一個native方法,根據注釋我們知道,這個方法返回的是該類的Class對象,同時也是該類的二進制對象。
Class中有一個方法叫getDeclaredFields(),是用來返回這個類的全部字段,返回類型是Field[]
通過Field對象的getAnnotation(Class<?>)方法,我們可以獲取到任何一個Class的對象,通過getAnnotation(Class<?>),我們就可以獲取到BindView的對象了。

例如

  1. Field[] fields = currentClass.getClass().getDeclaredFields(); 
  2. for(int i = 0; i < fields.length; i++){ 
  3.   
  4.     BindView bindView = field.getAnnotation(BindView.class); 
  5.       
  6.     int viewId = bindView.id();  //這是我們傳的id 
  7.       
  8.     boolean clickLis = bindView.click(); //這是我們傳的click 

在Android項目中應用:

至此,我們已經了解了注解,并且知道怎么使用,怎么處理注解了,現在只剩下最后一個問題:在項目中使用。
很簡單,傳一個Activity對象,調用findViewById()不就行了。
于是,我們可以這樣
activity.findViewById( bindView.id() );
最后在我們的Activity中調用這個函數就OK了。

以下是Android應用框架KJFrameForAndroid中使用注解綁定控件的核心代碼:

  1. /** 
  2.      * @param currentClass 
  3.      *            當前類,一般為Activity或Fragment 
  4.      * @param sourceView 
  5.      *            待綁定控件的直接或間接父控件 
  6.      */ 
  7.     public static void initBindView(Object currentClass, View sourceView) { 
  8.         // 通過反射獲取到全部屬性,反射的字段可能是一個類(靜態)字段或實例字段 
  9.         Field[] fields = currentClass.getClass().getDeclaredFields(); 
  10.         if (fields != null && fields.length > 0) { 
  11.             for (Field field : fields) { 
  12.                 // 返回BindView類型的注解內容 
  13.                 BindView bindView = field.getAnnotation(BindView.class); 
  14.                 if (bindView != null) { 
  15.                     int viewId = bindView.id(); 
  16.                     boolean clickLis = bindView.click(); 
  17.                     try { 
  18.                         field.setAccessible(true); 
  19.                         if (clickLis) { 
  20.                             sourceView.findViewById(viewId).setOnClickListener( 
  21.                                     (OnClickListener) currentClass); 
  22.                         } 
  23.                         // 將currentClass的field賦值為sourceView.findViewById(viewId) 
  24.                         field.set(currentClass, sourceView.findViewById(viewId)); 
  25.                     } catch (Exception e) { 
  26.                         e.printStackTrace(); 
  27.                     } 
  28.                 } 
  29.             } 
  30.         } 
  31.     } 

其實安卓中的注解式綁定控件(也是所謂的IOC控制反轉在安卓中的一種應用)其實本質的使用就是Java基礎中反射的使用。值得一提的是,反射執行的效率是很低的
如果不是必要,應當盡量減少反射的使用,因為它會大大拖累你應用的執行效率。
順帶一提:我一直很排斥注解,因為類反射的效率太低了?,F在有很多安卓應用開發框架,比如KJFrameForAndroid, xUtils, afinal, thinkAndroid,這些框架都是使用反射來起到注解綁定控件。
更有的框架甚至是一切東西都使用注解去完成,我只能說注解便捷,但請慎用。

本文鏈接:http://my.oschina.net/kymjs/blog/305882

責任編輯:chenqingxiang 來源: oschina
相關推薦

2009-07-01 17:04:13

ListViewVisual Stud

2009-08-07 15:34:15

ASP.NET數據綁定

2009-08-07 15:45:26

ASP.NET復合控件數據綁定

2009-08-05 17:43:48

ASP.NET 2.0

2009-08-13 15:40:29

C#數據綁定控件

2009-08-03 18:15:05

ASP.NET數據綁定

2009-09-15 15:14:27

C# 綁定

2014-11-14 10:57:24

Android控件

2015-03-03 15:53:31

Android控件

2022-08-22 09:01:24

Vue響應式原則雙向數據綁定

2022-12-13 08:29:13

項目插入式注解

2024-09-14 09:59:04

2009-08-05 17:58:53

自定義集合ASP.NET 2.0

2014-12-31 16:20:02

時間選擇日歷Android

2022-06-27 08:36:27

分布式事務XA規范

2014-09-24 11:42:46

AndroidButton

2011-09-09 17:31:45

Android WebJavascript

2016-03-14 09:43:47

androidview總結

2010-01-28 17:07:03

Android Gal

2017-02-13 17:17:48

Android標題欄控件
點贊
收藏

51CTO技術棧公眾號

久久99九九| 亚洲第一页自拍| 在线一区日本视频| 99国产精品一区二区三区| 欧美日韩视频| 日韩成人免费视频| 中文字幕久久av| 国产免费拔擦拔擦8x高清在线人| 久久精品夜色噜噜亚洲aⅴ| 成人一区二区电影| 久久免费激情视频| 香港欧美日韩三级黄色一级电影网站| 精品久久久久久久一区二区蜜臀| www.xxx亚洲| 国产第一页在线视频| 欧美激情一区二区三区| 国产精品国产三级国产专区53 | 91久久伊人青青碰碰婷婷| 国产精品自拍视频一区| 日韩在线观看一区| 精品亚洲一区二区三区在线播放 | 青青草成人免费在线视频| a视频网址在线观看| gogo大胆日本视频一区| 91精品久久久久久久| 国产女同在线观看| 女人香蕉久久**毛片精品| 国产午夜精品全部视频在线播放| 色哟哟无码精品一区二区三区| 国产黄色精品| 亚洲精品日韩综合观看成人91| 日韩影片在线播放| 深夜影院在线观看| 成人爽a毛片一区二区免费| 国产精品一区二区三区毛片淫片| 欧美日韩一二三四区| 中文字幕日韩一区二区不卡 | 4438x成人网最大色成网站| 欧美丰满熟妇bbbbbb百度| 亚洲精品天堂| 亚洲欧美aⅴ...| 亚洲第一导航| 国产亚洲依依| 久久久夜色精品亚洲| 精品欧美一区二区久久久伦| 亚洲国产剧情在线观看| 国产一本一道久久香蕉| 国产欧美久久一区二区| 手机av免费观看| 久久av一区二区三区| 97在线视频免费| 日韩美女一级片| 一区二区三区四区在线观看国产日韩| 综合久久五月天| 国产又粗又猛又爽又黄av | 国产在线精品一区二区夜色| 国产精品日韩精品| 国产免费a视频| 日日夜夜精品免费视频| 欧美在线精品免播放器视频| 国产精品suv一区二区三区| 99视频+国产日韩欧美| 国产+成+人+亚洲欧洲| 久久久久久久九九九九| 国产一区日韩欧美| 欧美激情精品久久久久久久变态| 欧美成人免费观看视频| 午夜欧美精品久久久久久久| 欧美激情二区三区| 久久精品国产亚洲av香蕉 | 日本精品久久久久中文字幕| 欧美大片免费观看网址| 在线观看www91| 国产精品v日韩精品v在线观看| 欧美97人人模人人爽人人喊视频| 欧美日韩免费一区二区三区| 久久久精品高清| 一区二区三区国产好| 精品久久一区二区| 少妇户外露出[11p]| 神马影视一区二区| 深夜福利国产精品| 永久看片925tv| 日韩视频三区| 国产精品第3页| 国产精品午夜福利| 成人综合婷婷国产精品久久蜜臀| 精品国产综合| 97电影在线看视频| 亚洲蜜桃精久久久久久久| 久草视频这里只有精品| 亚洲一级少妇| 欧美一区二区视频在线观看2020| 亚洲最大视频网| 国产日产精品_国产精品毛片| 最近2019中文免费高清视频观看www99 | 亚洲成人福利在线| 韩国一区二区三区视频| 亚洲韩国日本中文字幕| av永久免费观看| 欧美全黄视频| 国产成人免费av电影| 国产精品系列视频| 久久综合色天天久久综合图片| 亚洲成人一区二区三区| 日本无删减在线| 色婷婷亚洲婷婷| 三上悠亚 电影| 精品国产视频| 欧美精品福利在线| 真实新婚偷拍xxxxx| 成人黄色在线网站| 亚洲欧美久久久久一区二区三区| 丰满大乳少妇在线观看网站| 欧美日韩高清一区| 亚洲AV无码国产精品| 在线国产一区| 国产精品久久久久久久久久东京 | 青青青在线观看视频| 都市激情亚洲综合| 欧美videos大乳护士334| 国产一区二区三区视频播放| 一本色道久久综合一区| 91蜜桃网站免费观看| 成年人在线观看| 婷婷中文字幕综合| 佐佐木明希电影| 66国产精品| 国产免费一区视频观看免费 | 久久新电视剧免费观看| 欧美在线观看黄| 91精品国产色综合久久不卡粉嫩| 亚洲美女视频网| 欧美人与禽zozzo禽性配| 看片网站欧美日韩| 日韩中文一区二区三区| 精品人人视频| 亚洲成色999久久网站| 中文字幕电影av| 九色综合狠狠综合久久| 亚洲精品在线观看免费| 精品日韩视频| 亚洲偷熟乱区亚洲香蕉av| 欧美一级片免费在线观看| 成人18视频日本| 免费看欧美黑人毛片| 亚洲91网站| 久久91亚洲精品中文字幕| 国产一区二区波多野结衣| 欧美激情在线一区二区| 久久婷婷国产91天堂综合精品| 深夜福利久久| 国产精品美女久久久久av超清| 精品久久久久一区二区三区| 一本大道av伊人久久综合| 日本一区二区三区网站| 一本不卡影院| 久久久久欧美| 亚洲美女久久精品| 亚洲女人被黑人巨大进入| 国产无套丰满白嫩对白| 久久久综合精品| 欧美国产日韩在线播放| 精品国产一区二区三区噜噜噜| 日韩免费观看网站| 成人免费视频| 欧美日韩成人一区二区| 欧美一区二区三区爽爽爽| 韩国av一区二区三区| 黄色一级片av| 精品国产午夜肉伦伦影院| 欧美精品电影在线| 青青色在线视频| 在线免费观看日本一区| 亚洲欧美精品久久| 国产成人精品1024| 91国视频在线| 区一区二视频| 91嫩草免费看| 97成人资源| 日韩在线播放av| 性生活视频软件| 欧美日韩在线一区| 秋霞欧美一区二区三区视频免费| 狠狠色丁香九九婷婷综合五月| 久草视频这里只有精品| 自拍亚洲一区| 成人欧美一区二区三区在线 | 亚洲午夜羞羞片| 亚洲国产无码精品| 久久99精品国产麻豆不卡| 大西瓜av在线| 欧美一区二区麻豆红桃视频| 99九九电视剧免费观看| 成人日韩在线观看| 欧美成人午夜激情| 精品999视频| 欧美电视剧在线看免费| 精品成人无码久久久久久| 亚洲免费毛片网站| 99久久人妻无码精品系列| 黄一区二区三区| 麻豆国产精品视频| 免费观看成人高| 成人综合日日夜夜| 欧美亚洲另类视频| а√资源新版在线天堂| 精品亚洲精品福利线在观看| 国产视频第一页| 色婷婷国产精品| 美女视频黄免费| 国产视频911| 男人网站在线观看| 国精品**一区二区三区在线蜜桃| 日本免费不卡一区二区| 欧美1区3d| 亚洲一区三区电影在线观看| 日韩三级视频| 成人av片网址| 羞羞视频在线观看一区二区| 国产成人精品日本亚洲专区61| 暧暧视频在线免费观看| 久久久国产精品亚洲一区| 九色视频在线播放| 亚洲国产精品一区二区三区| www.久久精品.com| 精品视频资源站| 波多野结衣在线电影| 午夜免费久久看| 久久免费精彩视频| 综合色天天鬼久久鬼色| avhd101老司机| 久久久亚洲午夜电影| 一起草在线视频| 成人免费视频网站在线观看| 午夜天堂在线视频| 久久精品国产一区二区| 99久久久无码国产精品6| 在线欧美亚洲| 成人免费毛片在线观看| 亚洲欧美综合| 精品日韩在线播放| 亚洲成人最新网站| 亚洲电影一二三区| 精品国产中文字幕第一页| 蜜桃av色综合| 国产精品一区二区99| 欧美精品123| 九九综合在线| 日本不卡二区高清三区| 国产一区二区三区四区大秀| 欧美 日韩 国产在线| 久久91成人| 日本一区二区在线视频| 狠狠色丁香婷婷综合影院| 欧美久久电影| 欧美日韩123| 亚洲国产精品综合| 日韩免费在线| 亚洲人成网站在线播放2019| 色喇叭免费久久综合网| 亚洲欧美国产精品桃花| 亚洲a在线视频| 伊人久久在线观看| 亚洲国产精品一区制服丝袜| 久久精品国产亚洲精品| a视频网址在线观看| 日韩在线观看免费高清| 日韩美女网站| 欧美乱大交xxxxx另类电影| 四季久久免费一区二区三区四区| 色综合久综合久久综合久鬼88 | 国内精品久久久久久影视8| 不卡专区在线| 国产成人综合av| 亚洲精品aaa| 国产日韩欧美二区| 米奇777超碰欧美日韩亚洲| 亚洲v欧美v另类v综合v日韩v| 99久久www免费| 国产成人一区二区三区别| 国产欧美丝祙| 午夜久久福利视频| 成人污视频在线观看| 一区二区黄色片| 亚洲欧美在线高清| 日产欧产va高清| 欧美性感一类影片在线播放| 国产伦精品一区二区三区四区 | 亚洲成人tv| 久久久久久久久久网| 日本美女一区二区三区视频| 亚洲欧美激情一区二区三区| xfplay精品久久| 日本高清不卡免费| 91久久线看在观草草青青| 99久久亚洲精品日本无码| 亚洲精品国精品久久99热一| 在线观看麻豆| 97在线观看免费| 国产一区二区三区视频在线| 久久久久资源| 一区二区三区在线电影| 91猫先生在线| 国产精品18久久久久久久久| 久久精品视频18| 午夜在线电影亚洲一区| 91成品人影院| 国产偷亚洲偷欧美偷精品| 91精品国产91久久久久久青草| 日本不卡高字幕在线2019| 色妞ww精品视频7777| 日韩欧美亚洲精品| 日韩一级欧洲| 99riav国产精品视频| 国产精品久久久久久久裸模 | 亚洲少妇诱惑| 少妇愉情理伦片bd| 国产欧美日韩亚州综合| wwwxxx亚洲| 欧美成人一区二区三区| 色开心亚洲综合| 日韩美女视频在线观看| 久久精品66| www.激情网| 麻豆成人久久精品二区三区红| aa一级黄色片| 亚洲成人av资源| www夜片内射视频日韩精品成人| 一区二区av在线| 美女福利一区二区| 精品福利影视| 红桃视频欧美| 少妇熟女视频一区二区三区| 亚洲欧美日韩精品久久久久| 亚洲天堂网视频| 在线视频免费一区二区| 日本免费久久| 欧美午夜精品久久久久免费视| 夜夜爽av福利精品导航| 国产国语老龄妇女a片| 一区二区三区美女| 精品人妻av一区二区三区| 欧美精品一区三区| 欧美经典一区| www.激情网| 成人高清视频在线观看| 日韩精品成人一区| 亚洲第一精品夜夜躁人人爽| 久久av色综合| 激情伦成人综合小说| 99精品视频免费观看| 中文字幕影片免费在线观看| 精品久久久久久中文字幕一区奶水| 人妻少妇精品无码专区久久| 97精品在线视频| 青青视频一区二区| 欧美a在线视频| 国产午夜亚洲精品午夜鲁丝片| 午夜一区二区三区四区| 中文字幕亚洲欧美日韩2019| 欧洲精品久久久久毛片完整版| 裸体裸乳免费看| 成人网男人的天堂| 超碰超碰超碰超碰| 亚洲午夜激情免费视频| 国产极品久久久久久久久波多结野| 亚洲精品中文字幕乱码三区不卡| 国内精品伊人久久久久影院对白| 一区二区三区四区五区| 欧美va亚洲va在线观看蝴蝶网| 欧美另类老肥妇| 亚洲国产欧美一区二区三区不卡| 国产一区二区三区观看| 九九九国产视频| 亚洲无av在线中文字幕| 欧美日韩视频免费看| 欧美日韩视频免费| 97超碰欧美中文字幕| а中文在线天堂| 久久国产精品影视| 啪啪国产精品| 高清一区在线观看| 亚洲精品高清在线观看| 视频在线不卡| 91系列在线观看| 国产视频久久| 91传媒免费观看| 精品国产髙清在线看国产毛片 | 91亚洲永久免费精品| 136国产福利精品导航网址| 人妻一区二区视频| 日韩欧美一级片| 亚洲四虎影院| 久操手机在线视频| 国产日韩精品一区| 亚洲av色香蕉一区二区三区| 国产成人精品a视频一区www| 国产精品大片| 成熟人妻av无码专区|