一、简单介绍

啥是注解。不懂的能够先看我上一篇文章。

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

  • 和编译器一起给你一些提示警告信息。

  • 配合一些ide 能够更加方便快捷 安全有效的编写java代码。

    谷歌出的support-annotations这个库 就是主要干这个的。

  • 和反射一起 提供一些相似于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就会提示警告

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbml1Yml0aWFucGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

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

posted @
2017-08-17 19:38 
yangykaifa 
阅读(...) 
评论(...) 
编辑 
收藏

最新文章

  1. struct 大小计算
  2. zedboard如何从PL端控制DDR读写(六)
  3. springMVC+MyBatis+Spring+maven 整合(1)
  4. initrd.gz的解压和制作
  5. Android 连接 SQL Server (jtds方式)——上
  6. linux中的cd ..和cd -命令有什么区别?
  7. 动态绑定Gridview带模板列
  8. Windows Phone开发(22):启动器与选择器之BingMapsDirectionsTask
  9. .8-Vue源码之AST(4)
  10. yield next和yield* next的区别
  11. Jumpstart for Oracle Service Bus Development
  12. Objective-C 是如何慢慢走红的?
  13. [转][SqlServer]收缩日志
  14. Java Core - 创建对象的两种方式
  15. linux中make的有关规则的特性
  16. oo作业总结(四)
  17. ADO.NET 【属性扩展】性别、年龄、编号
  18. 我来科普一下为毛很多人升级了20M的电信光纤宽带反而感觉速度更卡了
  19. Django单元测试简单示例
  20. Windows Azure Mobiles Services实现client的登录注冊

热门文章

  1. sql如何通过当前日期获取上周,上上周,上上上周的起始日期(周一_周七)
  2. redis数据淘汰策略
  3. 如何在eclipse中创建.properties文件
  4. 输出数组第k大的元素
  5. 在大负载中使用LoadRunner进行负载测试()
  6. mysql5.6特殊字符问题
  7. Dockerfile 构建后端tomcat应用并用shell脚本实现jenkins自动构建
  8. Golang 如何从socket读出所有数据
  9. linux shell 脚本攻略学习16--wc命令详解,tree命令详解
  10. arping 帮助——翻译