Android AOP 注解详解及简单使用实例(三)

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");

 }

}

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

(0)

相关推荐

  • Android中封装SDK时常用的注解总结

    前言 在工作中我们经常需要将功能模块封装成库供合作厂商调用, 如何写好一个健壮的Android Library有很多讲究,使用注解可以对SDK暴露给开发者的接口做出一些限制,从而尽可能地避免开发者错误地使用API. 下面我们介绍几种封装SDK时常用到的注解,需要的朋友们可以参考学习. 一.IntDef与StringDef 我们有时候会使用int常量或者String常量来代替枚举, 特别在你编写SDK的时候,你可以通过IntDef或者StringDef来限制接口可接受的参数. 比如,有一个 dis

  • 深入分析安卓(Android)中的注解

    归纳而言,Android中的注解大概有以下好处 1.提高我们的开发效率 2.更早的发现程序的问题或者错误 3.更好的增加代码的描述能力 4.更加利于我们的一些规范约束 5.提供解决问题的更优解 准备工作 默认情况下,Android中的注解包并没有包括在framework中,它独立成一个单独的包,通常我们需要引入这个包. dependencies { compile 'com.android.support:support-annotations:22.2.0' } 但是如果我们已经引入了 app

  • Android注解框架对比分析

    Java的注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,标记可以加在包,类,属性,方法,本地变量上.然后你可以写一个注解处理器去解析处理这些注解(人称编译时注解),也可以在程序运行时利用反射得到注解做出相应的处理(人称运行时注解). 开发Android程序时,没完没了的findViewById, setOnClickListener等等方法,已经让大多数开发者头疼不已.好在市面上有所谓的注解框架可以帮助开发者简化一些过程.比较流行的有butterknife

  • Android 中的注解详细介绍

    注解是我们经常接触的技术,Java有注解,Android也有注解,本文将试图介绍Android中的注解,以及ButterKnife和Otto这些基于注解的库的一些工作原理. 归纳而言,Android中的注解大概有以下好处 提高我们的开发效率 更早的发现程序的问题或者错误 更好的增加代码的描述能力 更加利于我们的一些规范约束 提供解决问题的更优解 准备工作 默认情况下,Android中的注解包并没有包括在framework中,它独立成一个单独的包,通常我们需要引入这个包. dependencies

  • Android 中的注解深入探究

    本文系GDG Android Meetup分享内容总结文章 注解是我们经常接触的技术,Java有注解,Android也有注解,本文将试图介绍Android中的注解,以及ButterKnife和Otto这些基于注解的库的一些工作原理. 归纳而言,Android中的注解大概有以下好处 提高我们的开发效率 更早的发现程序的问题或者错误 更好的增加代码的描述能力 更加利于我们的一些规范约束 提供解决问题的更优解 准备工作 默认情况下,Android中的注解包并没有包括在framework中,它独立成一个

  • Android注解使用之ButterKnife 8.0详解

    前言: App项目开发大部分时候还是以UI页面为主,这时我们需要调用大量的findViewById以及setOnClickListener等代码,控件的少的时候我们还能接受,控件多起来有时候就会有一种想砸键盘的冲动.所以这个时候我们想着可以借助注解的方式让我们从这种繁重的工作中脱离出来,也让代码变得更加简洁,便于维护,今天主要学习一下只专注View.Resource.Action注解框架ButterKnife. ButterKnife介绍 ButterKnife是一个专注于Android系统的V

  • Android注解ButterKnife的基本使用

    ButterKnife的最新版本是8.4.0. 首先,需要导入ButterKnife的jar包. 在AndroidStudio中,File->Project Structure->Dependencies->Library dependency 搜索butterknife即可,第一个就是. 另外一种就是直接在build:grade(app)dependencies里添加: compile 'com.jakewharton:butterknife:8.4.0' annotationProc

  • Android AOP之注解处理解释器详解(二)

    Android APO 注解处理解释器 相关文章: Android AOP注解Annotation详解(一) Android AOP之注解处理解释器详解(二) Android AOP 注解详解及简单使用实例(三) 一.提取Annotation信息 当开发者使用了Annotation修饰了类.方法.Field等成员之后,这些Annotation不会自己生效,必须由开发者提供相应的代码来提取并处理Annotation信息.这些处理提取和处理Annotation的代码统称为APT(Annotation

  • Android AOP注解Annotation详解(一)

    Android 注解Annotation 相关文章: Android AOP注解Annotation详解(一) Android AOP之注解处理解释器详解(二) Android AOP 注解详解及简单使用实例(三) Android AOP 等在Android上应用越来越广泛,例如框架ButterKnife,Dagger2,EventBus3等等,这里我自己总结了一个学习路程. - Java的注解Annotation - 注解处理解析器APT(Annotation Processing Tool)

  • Android AOP 注解详解及简单使用实例(三)

    Android  注解 相关文章: Android AOP注解Annotation详解(一) Android AOP之注解处理解释器详解(二) Android AOP 注解详解及简单使用实例(三) 一.简介 在Android 里面 注解主要用来干这么几件事: 和编译器一起给你一些提示警告信息. 配合一些ide 可以更加方便快捷 安全有效的编写Java代码.谷歌出的support-annotations这个库 就是主要干这个的. 和反射一起 提供一些类似于spring 可配置的功能,方便简洁. 二

  • JAVA 注解详解及简单实例

    JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档  这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖性  可以通过注解替代配置文件,简化项目的配置.现有的许多框架都采用这个功能减少自己的配置. 编译检查  在编译时进行格式检查,例如@Override 基础注解 Java目前内置了三种标准注解,以及四种元注解.四种元注解负责创建其他的注解. 三种标准注解 @Override,表示当前的方法覆盖超类中

  • Android 中Seekbar详解及简单实例

    Android 中Seekbar详解及简单实例 做到音频播放和音乐播放时,大多数都要用到Seekbar.现在我先简单介绍下Seekbar的几个重要属性. android:max 设置值的大小 . android:thumb="@drawable/" 显示的那个可拖动图标,如果没有设置该参数则为系统默认,如果自己需要重新定义,则将自己需要的图标存放在资源目录 /res/drawable下,然后调用即可. android:thumbOffset 拖动图标的偏量值,可以让拖动图标超过bar的

  • Android 文件操作详解及简单实例

     Android 文件操作详解 Android 的文件操作说白了就是Java的文件操作的处理.所以如果对Java的io文件操作比较熟悉的话,android的文件操作就是小菜一碟了.好了,话不多说,开始今天的正题吧. 先从一个小项目入门吧 首先是一个布局文件,这一点比较的简单,那就直接上代码吧. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="htt

  • Android中SharedPreference详解及简单实例

     Android中SharedPreference详解 SharedPreference是Android提供的一种轻量级的数据存储方式,主要用来存储一些简单的配置信息,例如,默认欢迎语,登录用户名和密码等.其以键值对的方式存储,使得我们能很方便进行读取和存入. SharedPreference 文件保存在/data/data/<package name>/shared_prefs 路径下(如/data/data/com.android.alarmclock/shared_prefs/com.a

  • Android wifi 调试详解及简单实例

    Android wifi 调试 前言: 做android开发的时候,经常遇到的一个问题就是真机调试次数多了,会导致usb口,损坏,而且长期给手机充电也会损坏手机,所以我想了想是否可以拿usb调试,网上找了下,还真可以,但都写的比较繁琐,今天我们就使用3条命令完成任务 首先我们需要使用的工具是adb,它基于tcp协议之上 1.开始我们需要给手机开启tcpip模式,这个时候需要usb线连接手机 adb tcpip 端口号(随便写个大点的比如:5555) 写完这个之后,usb就没用了 2.你需要查看你

  • Java 事务详解及简单应用实例

    Java事务的简单使用  Java事务在一些面试中会被问到. 面试的时候,我们首先要回答的是:事务能够保证数据的完整性和一致性. 如果功力深厚点的话:就说一些原理(任务开始前先设置不提交任务,在所有任务完成后再提交任务, 如果任务在中间断开,就执行回滚,撤销前面执行的任务),简单一点就举个的例子(比如存钱和取钱的问题. 比如:银行在两个账户之间转账,从A账户转入B账户1000元,系统先减少A账户的1000元,然后再为B账号增加1000元.如果全部执行成功,数据库处于一致性:如果仅执行完A账户金额

  • Java 序列化详解及简单实现实例

    一.序列化 序列化定义:序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 目的: 以某种存储形式使自定义对象持久化 将对象从一个地方传递到另一个地方 二.Java序列化 一个对象能够序列化的前提是实现Serializable接口.Serializable接口没有方法,更像是个标记.有了这个标记的Class就能被序列化机制处理.如下: class myPoint implements Serializabl

  • Android 实现夜间模式的快速简单方法实例详解

    ChangeMode 项目地址:ChangeMode Implementation of night mode for Android. 用最简单的方式实现夜间模式,支持ListView.RecyclerView. Preview Usage xml android:background="?attr/zzbackground" app:backgroundAttr="zzbackground"//如果当前页面要立即刷新,这里传入属性名称 比如 R.attr.zzb

随机推荐