一、简单介绍
啥是注解。不懂的能够先看我上一篇文章。
在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解析器
/**
* 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();
Leetcode812.Largest Triangle Area最大三角形面积
Leetcode812.Largest Triangle Area最大三角形面积
Leetcode811.Subdomain Visit Count子域名访问计数
Leetcode811.Subdomain Visit Count子域名访问计数
Leetcode806.Number of Lines To Write String写字符串需要的行数
Leetcode806.Number of Lines To Write String写字符串需要的行数
Leetcode819.Most Common Word最常见的单词
Leetcode819.Most Common Word最常见的单词
Leetcode783.Minimum Distance Between BST Nodes二叉搜索树结点最小距离
- 最新文章
-
【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)
【HDU 1133】 Buy the Ticket (卡特兰数)
【BZOJ 1319】 Sgu261Discrete Rootsv (原根+BSGS+EXGCD)
【转】初等数论 ——原根、指标及其应用
【HDU 4992】 Primitive Roots (原根)
【阶】【原根】【指标】
【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
【GDOI 2011 DAY2 T3】零什么的最讨厌了 (快速求阶乘、中国剩余定理)
【BZOJ 3529】 [Sdoi2014]数表 (莫比乌斯+分块+离线+树状数组)
【BZOJ 2693】jzptab(莫比乌斯+分块)