日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Android注解式綁定控件

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

公司主營業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出農(nóng)安免費做網(wǎng)站回饋大家。

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

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

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

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

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

 
 
 
 
  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; 

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

我們已經(jīng)知道了注解怎么定義和使用,接下來就應(yīng)該知道怎么處理了。
上面已經(jīng)說了,bindview注解可以接受一個int類型的值和一個Boolean類型的值,那么這兩個值接受了以后如何獲取呢?
其實獲取的方式很簡單就是通過一個BindView類型的對象,調(diào)用這個對象來自聲明中定義的兩個方法——>id()或click()方法。
現(xiàn)在就有一個問題了,注解類型是不能直接new對象的,那么這個BindView對象從哪里來呢?
這時就需要用到Java的反射機制。我們知道,每一個繼承自O(shè)bject類的類都會繼承一個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} where {@code Foo} is the 
  5.     * erasure of the type of the expression {@code getClass()} was called upon. 
  6.     * 

     

  7.     * As an example, the following code actually compiles, although one might 
  8.     * think it shouldn't: 
  9.     * 

     

  10.     * 
    {@code 
  11.     *   List l = new ArrayList(); 
  12.     *   Class c = l.getClass();}
 
  •     * 
  •     * @return this object's {@code Class} instance. 
  •     */ 
  •    public final native Class getClass(); 
  • 是一個native方法,根據(jù)注釋我們知道,這個方法返回的是該類的Class對象,同時也是該類的二進制對象。
    Class中有一個方法叫g(shù)etDeclaredFields(),是用來返回這個類的全部字段,返回類型是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項目中應(yīng)用:

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

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

     
     
     
     
    1. /** 
    2.      * @param currentClass 
    3.      *            當前類,一般為Activity或Fragment 
    4.      * @param sourceView 
    5.      *            待綁定控件的直接或間接父控件 
    6.      */ 
    7.     public static void initBindView(Object currentClass, View sourceView) { 
    8.         // 通過反射獲取到全部屬性,反射的字段可能是一個類(靜態(tài))字段或?qū)嵗侄?nbsp;
    9.         Field[] fields = currentClass.getClass().getDeclaredFields(); 
    10.         if (fields != null && fields.length > 0) { 
    11.             for (Field field : fields) { 
    12.                 // 返回BindView類型的注解內(nèi)容 
    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控制反轉(zhuǎn)在安卓中的一種應(yīng)用)其實本質(zhì)的使用就是Java基礎(chǔ)中反射的使用。值得一提的是,反射執(zhí)行的效率是很低的
    如果不是必要,應(yīng)當盡量減少反射的使用,因為它會大大拖累你應(yīng)用的執(zhí)行效率。
    順帶一提:我一直很排斥注解,因為類反射的效率太低了?,F(xiàn)在有很多安卓應(yīng)用開發(fā)框架,比如KJFrameForAndroid, xUtils, afinal, thinkAndroid,這些框架都是使用反射來起到注解綁定控件。
    更有的框架甚至是一切東西都使用注解去完成,我只能說注解便捷,但請慎用。

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


    新聞標題:Android注解式綁定控件
    網(wǎng)站路徑:http://www.5511xx.com/article/cohcdih.html