Android  注解

相关文章:

Android AOP注解Annotation详解(一)
Android AOP之注解处理解释器详解(二)
Android AOP 注解详解及简单使用实例(三)

一、简介

在Android 里面 注解主要用来干这么几件事:

  1. 和编译器一起给你一些提示警告信息。
  2. 配合一些ide 可以更加方便快捷 安全有效的编写Java代码。谷歌出的support-annotations这个库 就是主要干这个的。
  3. 和反射一起 提供一些类似于spring 可配置的功能,方便简洁。

二、Support Annotations栗子

这里使用官方的一个库,说明在开发中的简单一个应用。

2.1 导包

在新建项目的时候会自动导的,可以看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版本号):

compile 'com.android.support:support-annotations:xx.x.x'

2.2 使用

这时候就可以使用一些support-annotations提供的注解,下面举一些栗子:

1、 @NonNull

test方法参数添加了一个NonNull注解,然后我们传递一个空的参数过去。

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就会提示警告

2、 @StringRes

再定义testString方法参数添加了一个StringRes注解,然后我们传递一个数字过去。

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就会提示

三、实现自己的ButterKnife

经过之前的知识,我们已经知道注解的原理和使用了,这里实现ButterKnife的一个简单功能,View的注入: 一个注解,一个解析器即可。

3.1 BindView注解

@Target(ElementType.FIELD) //解析常量@Retention(RetentionPolicy.RUNTIME) //运行时public @interface BindView {  int value() default -1; //标识控件}

3.2 BindViewParser解析器

/** * Created by Litp on 2017/2/17. */public class BindViewParser { /**  * 传递activty或者View 对象,使用反射获取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) {   //这个变量 是否有BindView注解   if (field.isAnnotationPresent(BindView.class)) {    //获取这个变量对应的注解    BindView injectView = field.getAnnotation(BindView.class);    //获取值    int id = injectView.value();    if (id <= 0) {     throw new Exception("View的id不能为空");    } else {     //设置可以访问     field.setAccessible(true);     //获取view     if (object instanceof View) {      view = ((View) object).findViewById(id);     } else if (object instanceof Activity) {      view = ((Activity) object).findViewById(id);     }     //设置View     field.set(object, view);    }   }  } }}

3.3 Activity使用

public class MainActivity extends AppCompatActivity { //使用注解标识变量 @BindView(R.id.tv_test) TextView textView; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  //传递当前activty给解析器,进行初始化view  BindViewParser.inject(this);  //这里就已经是初始化完毕了,可以进行使用了  textView.setText("测试自己的注入demo"); }}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多相关文章

  1. Android加密之全盘加密详解
  2. 深入了解android平台的jni(二)
  3. Android(安卓)LinearLayout详解
  4. Android耳机线控详解,蓝牙耳机按钮监听(仿酷狗线控效果)
  5. Android窗口标题显示操作
  6. WebView使用中js调用java代码时targetSdkVersion大于17时,无法调
  7. 0基础,安卓搭建环境,运行HelloWord
  8. 安卓中contentDescription属性的作用详解
  9. Android修改TitleBar标题栏详解

随机推荐

  1. Android视图加载到窗口的过程
  2. Android设备唯一标识的获取和构造
  3. Android(安卓)耳机系统综述
  4. Android调用so文件(C代码库)方法详解
  5. Android应用程序绑定服务(bindService)的过
  6. android 文件夹的命名和作用,屏幕适配很有
  7. Android分辨率适配心得
  8. Android(安卓)图片缓存处理
  9. Android(安卓)Android自定义的下拉列表框
  10. android: Handler概念理解与运用