Android AOP 注解詳解及簡(jiǎn)單使用實(shí)例(三)
Android 注解
相關(guān)文章:
Android AOP注解Annotation詳解(一)
Android AOP之注解處理解釋器詳解(二)
Android AOP 注解詳解及簡(jiǎn)單使用實(shí)例(三)
一、簡(jiǎn)介
在Android 里面 注解主要用來干這么幾件事:
- 和編譯器一起給你一些提示警告信息。
- 配合一些ide 可以更加方便快捷 安全有效的編寫Java代碼。谷歌出的support-annotations這個(gè)庫 就是主要干這個(gè)的。
- 和反射一起 提供一些類似于spring 可配置的功能,方便簡(jiǎn)潔。
二、Support Annotations栗子
這里使用官方的一個(gè)庫,說明在開發(fā)中的簡(jiǎn)單一個(gè)應(yīng)用。
2.1 導(dǎo)包
在新建項(xiàng)目的時(shí)候會(huì)自動(dòng)導(dǎo)的,可以看build.gradle中的依賴dependencies是這樣的。
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.1.1' testCompile 'junit:junit:4.12' }
如果沒有的話,自己在build.gradle的依賴添加(xx.x.x為你的compileSdkVersion版本號(hào)):
compile 'com.android.support:support-annotations:xx.x.x'
2.2 使用
這時(shí)候就可以使用一些support-annotations提供的注解,下面舉一些栗子:
1、 @NonNull
test方法參數(shù)添加了一個(gè)NonNull注解,然后我們傳遞一個(gè)空的參數(shù)過去。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String s = null; test(s); } public void test(@NonNull String s){ System.out.println(s); } }
IDE就會(huì)提示警告
2、 @StringRes
再定義testString方法參數(shù)添加了一個(gè)StringRes注解,然后我們傳遞一個(gè)數(shù)字過去。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); testString(112312); testString(R.string.app_name); } public void testString(@StringRes int s){ System.out.println(s); } }
IDE就會(huì)提示
三、實(shí)現(xiàn)自己的ButterKnife
經(jīng)過之前的知識(shí),我們已經(jīng)知道注解的原理和使用了,這里實(shí)現(xiàn)ButterKnife的一個(gè)簡(jiǎn)單功能,View的注入: 一個(gè)注解,一個(gè)解析器即可。
3.1 BindView注解
@Target(ElementType.FIELD) //解析常量 @Retention(RetentionPolicy.RUNTIME) //運(yùn)行時(shí) public @interface BindView { int value() default -1; //標(biāo)識(shí)控件 }
3.2 BindViewParser解析器
/** * Created by Litp on 2017/2/17. */ public class BindViewParser { /** * 傳遞activty或者View 對(duì)象,使用反射獲取view變量 * @param object */ public static void inject(Object object) { try { parse(object); } catch (Exception e) { e.printStackTrace(); } } /** * 解析獲取值 * @param object * @throws Exception */ public static void parse(Object object) throws Exception { final Class<?> clazz = object.getClass(); View view = null; //獲取clazz的變量,不論private還是public Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { //這個(gè)變量 是否有BindView注解 if (field.isAnnotationPresent(BindView.class)) { //獲取這個(gè)變量對(duì)應(yīng)的注解 BindView injectView = field.getAnnotation(BindView.class); //獲取值 int id = injectView.value(); if (id <= 0) { throw new Exception("View的id不能為空"); } else { //設(shè)置可以訪問 field.setAccessible(true); //獲取view if (object instanceof View) { view = ((View) object).findViewById(id); } else if (object instanceof Activity) { view = ((Activity) object).findViewById(id); } //設(shè)置View field.set(object, view); } } } } }
3.3 Activity使用
public class MainActivity extends AppCompatActivity { //使用注解標(biāo)識(shí)變量 @BindView(R.id.tv_test) TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //傳遞當(dāng)前activty給解析器,進(jìn)行初始化view BindViewParser.inject(this); //這里就已經(jīng)是初始化完畢了,可以進(jìn)行使用了 textView.setText("測(cè)試自己的注入demo"); } }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- 自定義Android注解系列教程之注解變量
- Android基于注解的6.0權(quán)限動(dòng)態(tài)請(qǐng)求框架詳解
- Android 反射注解與動(dòng)態(tài)代理綜合使用詳解
- Android注解使用之ButterKnife 8.0詳解
- Android中封裝SDK時(shí)常用的注解總結(jié)
- Android AOP之注解處理解釋器詳解(二)
- Android AOP注解Annotation詳解(一)
- Android注解框架對(duì)比分析
- Android注解ButterKnife的基本使用
- Android 中的注解詳細(xì)介紹
- Android 中的注解深入探究
- 深入分析安卓(Android)中的注解
- Android注解基礎(chǔ)介紹快速入門與解讀
相關(guān)文章
android暫?;蛲V蛊渌魳凡シ牌鞯牟シ艑?shí)現(xiàn)代碼
來自android自帶的music源碼,下面是廣播接收的代碼,通過發(fā)送廣播來控制音樂的播放,停止等2013-11-11Android 桌面Widget開發(fā)要點(diǎn)解析(時(shí)間日期Widget)
總的來說,widget主要功能就是顯示一些信息。我們今天編寫一個(gè)很簡(jiǎn)單的作為widget,顯示時(shí)間、日期、星期幾等信息。需要顯示時(shí)間信息,那就需要實(shí)時(shí)更新,一秒或者一分鐘更新一次2013-07-07Android Filterable實(shí)現(xiàn)Recyclerview篩選功能的示例代碼
這篇文章主要介紹了Android Filterable實(shí)現(xiàn)Recyclerview篩選功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02解決Android中自定義DialogFragment解決寬度和高度問題
Android中自定義DialogFragment解決寬度和高度問題但是我們很多時(shí)候想把DialogFragment的高度固定,那么我們需要設(shè)置DialogFragment的高度,在Fragment的onResume()聲明周期方法中設(shè)置window的寬高即可2017-12-12解決Android studio用真機(jī)調(diào)試時(shí)logcat一直輸出日志問題
這篇文章主要介紹了解決Android studio用真機(jī)調(diào)試時(shí)logcat一直輸出日志問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04詳解Android中通過Intent類實(shí)現(xiàn)組件間調(diào)用的方法
Intent能夠?qū)崿F(xiàn)應(yīng)用間的數(shù)據(jù)交互與通訊,將實(shí)現(xiàn)者和調(diào)用者解耦,接下來就來詳解Android中通過Intent類實(shí)現(xiàn)組件間調(diào)用的方法,需要的朋友可以參考下2016-05-05