Android 注解
相关文章:
Android AOP注解Annotation详解(一)
Android AOP之注解处理解释器详解(二)
Android AOP 注解详解及简单使用实例(三)
一、简介
在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就会提示警告
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解析器
public class BindViewParser {
public static void inject(Object object) {
try {
parse(object);
} catch (Exception e) {
e.printStackTrace();
}
}
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");
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:自定义Android注解系列教程之注解变量Android基于注解的6.0权限动态请求框架详解Android 反射注解与动态代理综合使用详解Android注解使用之ButterKnife 8.0详解Android中封装SDK时常用的注解总结Android AOP之注解处理解释器详解(二)Android AOP注解Annotation详解(一)Android注解框架对比分析Android注解ButterKnife的基本使用Android 中的注解详细介绍Android 中的注解深入探究深入分析安卓(Android)中的注解Android注解基础介绍快速入门与解读