• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統計

            最新評論

            【Android框架進階〖00〗】ThinkAndroid注解機制 --- 轉

            由于項目需要,開始研究ThinkAndroid。

            個人認為該框架的注解機制十分新穎,所以先研究這個,順便學習下 Java 的annotation。

            粗略的看了看,該機制在BaseActivity中初始化。而BaseActivity是所有Activity的基類。

            對BaseActivity進行了代碼剖離,發現在BaseActivity中在onCreate函數里啟動注解機制。

            • 首先注入布局資源(綁定layout布局)
            • 其次注入成員資源(綁定組件資源)
            • 然后注入成員變量(初始化普通變量)

            暫時先搞清楚第二個,怎么綁定組件資源的:

            我寫了個小demo,MyAnno

            InjectView.java

            1. package com.myanno;  
            2.   
            3. import java.lang.annotation.ElementType;  
            4. import java.lang.annotation.Retention;  
            5. import java.lang.annotation.RetentionPolicy;  
            6. import java.lang.annotation.Target;  
            7.   
            8.   
            9. /** 
            10.  * 自定義注解,獲取資源ID 
            11.  * @使用方法 
            12.  *              @InjectView(id = R.id.settingIv) 
            13.  *              private ImageView imgSetting;  
            14.  *  
            15.  * @author      michael.mao@sosino.com 
            16.  * @date        2013-10-29 
            17.  * @description @Retention: 定義注解的保留策略 
            18.  *              @Retention(RetentionPolicy.SOURCE)  //注解僅存在于源碼中,在class字節碼文件中不包含 
            19.  *              @Retention(RetentionPolicy.CLASS)   //默認的保留策略,注解會在class字節碼文件中存在,但運行時無法獲得, 
            20.  *              @Retention(RetentionPolicy.RUNTIME) //注解會在class字節碼文件中存在,在運行時可以通過反射獲取到 
            21.  *              @Inherited                          //說明子類可以繼承父類中的該注解 
            22.  * 
            23.  *              @Target(ElementType.TYPE)           //接口、類、枚舉、注解 
            24.  *              @Target(ElementType.FIELD)          //字段、枚舉的常量 
            25.  *              @Target(ElementType.METHOD)         //方法 
            26.  *              @Target(ElementType.PARAMETER)      //方法參數 
            27.  *              @Target(ElementType.CONSTRUCTOR)    //構造函數 
            28.  *              @Target(ElementType.LOCAL_VARIABLE) //局部變量 
            29.  *              @Target(ElementType.ANNOTATION_TYPE)//注解 
            30.  *              @Target(ElementType.PACKAGE)        //包    
            31.  */  
            32.   
            33. @Target(ElementType.FIELD)  
            34. @Retention(RetentionPolicy.RUNTIME)  
            35. public @interface InjectView  
            36. {  
            37.     /** View的ID */  
            38.     public int id() default -1;  
            39. }  

            MainActivity.java
            1. package com.myanno;  
            2.   
            3. import java.lang.reflect.Field;  
            4.   
            5. import android.app.Activity;  
            6. import android.os.Bundle;  
            7. import android.util.Log;  
            8. import android.view.View;  
            9. import android.widget.ImageView;  
            10. import android.widget.TextView;  
            11.   
            12. public class MainActivity extends Activity {  
            13.   
            14.     /** 注解綁定UI元素 */  
            15.     @InjectView(id=R.id.myimgview)  
            16.     ImageView myimageview;  
            17.       
            18.     @InjectView(id=R.id.mytext)  
            19.     TextView mytext;  
            20.   
            21.     @Override  
            22.     protected void onCreate(Bundle savedInstanceState) {  
            23.         super.onCreate(savedInstanceState);  
            24.         setContentView(R.layout.activity_main);  
            25.           
            26.         //初始化注解綁定的成員變量  
            27.         injectView(this);  
            28.           
            29.         //直接使用UI元素  
            30.         mytext.setText("Text0");  
            31.         myimageview.setImageResource(R.drawable.junny);  
            32.     }  
            33.       
            34.     /** 實例化@InjectView 注解的成員*/  
            35.     public void injectView(Activity activity)  
            36.     {  
            37.         Field[] fields = activity.getClass().getDeclaredFields();//得到Activity中的所有定義的字段  
            38.         if (fields != null && fields.length > 0)  
            39.         {  
            40.             for (Field field : fields)  
            41.             {  
            42.                 if (field.isAnnotationPresent(InjectView.class))//方法返回true,如果指定類型的注解存在于此元素上  
            43.                 {  
            44.                     Log.i("Field", field.toString());  
            45.                       
            46.                     InjectView mInjectView = field.getAnnotation(InjectView.class); //獲得該成員的annotation  
            47.                     int viewId = mInjectView.id();  //獲得該注解的id  
            48.                     View view=activity.findViewById(viewId);//獲得ID為viewID的組件對象  
            49.                       
            50.                     Log.i("Field", String.valueOf(viewId));  
            51.                     Log.i("Field", view.getClass().toString());  
            52.                       
            53.                     try  
            54.                     {  
            55.                         field.setAccessible(true);//設置類的私有成員變量可以被訪問  
            56.                         field.set(activity, view);//field.set(object,value)===object.fieldValue = value  
            57.                     } catch (Exception e) { e.printStackTrace();}  
            58.                 }  
            59.                 else  
            60.                     Log.i("Field", "該字段沒有被注解");  
            61.             }  
            62.         }  
            63.     }  
            64. }  

            布局文件 activity_main.xml
            1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
            2.     xmlns:tools="http://schemas.android.com/tools"  
            3.     android:layout_width="match_parent"  
            4.     android:layout_height="match_parent"  
            5.     android:background="#000000"  
            6.     android:orientation="vertical"  
            7.     tools:ignore="ContentDescription" >  
            8.     <ImageView  
            9.         android:id="@+id/myimgview"  
            10.         android:layout_width="wrap_content"  
            11.         android:layout_height="wrap_content"  
            12.         android:layout_gravity="center"/>  
            13.     <TextView  
            14.         android:id="@+id/mytext"  
            15.         android:layout_width="match_parent"  
            16.         android:layout_height="0dp"  
            17.         android:layout_weight="1"  
            18.         android:gravity="center"  
            19.         android:background="@android:color/darker_gray"  
            20.         android:textSize="30sp" />  
            21. </LinearLayout>  

            實驗結果

            即注入成功了 大笑


            需要說下我遇到的問題,在以上的基礎上,如果將布局文件里的TextView 和ImageView兩個布局換個位置,這時候再運行下,會出現空指針異常。

            將Log向上翻會發現一個警告

            即非法參數異常

            定位到這一行

            1. field.set(activity, view);  

            通過觀察Log打印的日志

            發現第一二行是對的,即獲得注解的類型和ID(ImageView 2131230720)都是正確的,但是通過findViewById獲取view的時候,Log第三行顯示的卻是TextView。

            百思不得其解,最后無賴之下,清理一下項目,搞定。

            我不知道是怎么回事,暫且推測為資源緩存吧。

            posted on 2013-12-10 19:20 大龍 閱讀(1609) 評論(0)  編輯 收藏 引用

            99久久人妻无码精品系列| 久久青青草原精品国产| 久久不见久久见免费影院www日本| 久久亚洲欧美日本精品| 青青草原综合久久大伊人导航| 国产精品久久久久免费a∨| 国产三级久久久精品麻豆三级| 国产精品99久久精品爆乳| 久久久久亚洲AV成人网人人网站| 久久久久AV综合网成人| 色婷婷久久久SWAG精品| avtt天堂网久久精品| 2019久久久高清456| 中文字幕亚洲综合久久| 午夜精品久久久久久久| 色婷婷综合久久久久中文字幕| 国产成人久久精品激情| 久久天天躁夜夜躁狠狠躁2022| 91亚洲国产成人久久精品网址| 国产A三级久久精品| 久久亚洲天堂| 国内精品久久久久久久影视麻豆| 日韩精品久久无码中文字幕| 日日狠狠久久偷偷色综合免费 | 日韩电影久久久被窝网| 东京热TOKYO综合久久精品| 囯产精品久久久久久久久蜜桃| 亚洲精品国产成人99久久| 99久久99久久久精品齐齐| 亚洲精品乱码久久久久久蜜桃不卡| 国产伊人久久| 久久精品中文字幕第23页| 国产巨作麻豆欧美亚洲综合久久| 久久综合九色综合精品| 青草影院天堂男人久久| 久久精品国产99国产电影网| 狠狠色丁香久久婷婷综| 国产亚洲美女精品久久久| 亚洲伊人久久大香线蕉苏妲己| 国产91色综合久久免费| 亚洲国产精品人久久|