欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android AOP 注解詳解及簡(jiǎn)單使用實(shí)例(三)

 更新時(shí)間:2017年03月07日 10:04:44   作者:tpnet  
這篇文章主要介紹了Android AOP 注解詳解及簡(jiǎn)單使用實(shí)例(三)的相關(guān)資料,需要的朋友可以參考下

Android  注解

相關(guān)文章:

Android AOP注解Annotation詳解(一)
Android AOP之注解處理解釋器詳解(二)
Android AOP 注解詳解及簡(jiǎn)單使用實(shí)例(三)

一、簡(jiǎn)介

在Android 里面 注解主要用來干這么幾件事:

  1. 和編譯器一起給你一些提示警告信息。
  2. 配合一些ide 可以更加方便快捷 安全有效的編寫Java代碼。谷歌出的support-annotations這個(gè)庫 就是主要干這個(gè)的。
  3. 和反射一起 提供一些類似于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ì)本站的支持!

相關(guān)文章

最新評(píng)論