有点懵懵的
关于如何自定义interface,本来是想去找@interface的用法的定义,我去api文档里面没有发现专门介绍的部分,可能是我遗漏了。后面有发现再补上。从示例来看可以发现用法:
其实这样不是很好,我特别想去找关于@interface的,后面看看关键字那个桥段吧。
网上有很多文章介绍。简单示例(后面所有的示例都以Android,同时以Butterknife作为引子):
/**
* Author:lieyun_android
* Time: 2018/5/7 14:13
* Des: This is BindView[your annotation'a name] for findviewbyId.
*/
public @interface BindView {
}
再结合下元注解扩展下
理解就是说:我们这个注解目标是FIELD类型,比如View, 枚举,整型等字段声明;另外运行周期是知道运行时都存在…
/**
* Author:lieyun_android
* Time: 2018/5/7 14:13
* Des: This is BindView[your annotation'a name] for findviewbyId.
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindView {
}
方法的我们也来一个吧
/**
* Author:lieyun_android
* Time: 2018/5/7 14:13
* Des: This is BindView for view.onclicklistenner....
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClickss {
}
这就是相对简单的自定义注解,那这个怎么使用了….这个注解目前还没有什么作用,仅仅只是声明了,我们一点点去实现效果吧。 首先看哈咋过使用!
比如控件,事件 – 基本上我们就是防butterknife的用法来的:
@BindView(R.id.xxxxx)
public TextView tv;
@OnClickss(R.id.xxx)
public void buttonClick(View view)
{
}
到这里我们基本了解定义和用法,但是这里并没什么卵用?
1.你定义@BindView(xxx)后, 谁去给tv赋值?
2.你定义了R.id.xx的OnClickss事件,这个事件的方法谁去调用???
So, 这就是我们下一步需要去做的事情 – 这就涉及到反射的知识了…!!!
Then, 我们这样定义只是简单版本,而且没有带任何参数,什么意思:这里我们@BindView(R.id.xxxx),意思其实就是想给tv赋值为ID是R.id.xxxx的控件,假使说BindView后面有人去解析它做一些事情,那如何得到这个R.id.xxxx呢?势必需要把这个R.id.xxxx作为参数传递给BindView注解,So,我们增加参数定义value:
以下都是单个参数:
/**
* Author:lieyun_android
* Time: 2018/5/7 14:13
* Des: This is BindView[your annotation'a name] for findviewbyId.
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindView {
///< 资源id
int value();
}
方法同理:
/**
* Author:lieyun_android
* Time: 2018/5/7 14:13
* Des: This is BindView for view.onclicklistenner....
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClickss {
///< 资源id
int value();
}
多个参数怎么传递过去了?
/**
* Author:lieyun_android
* Time: 2018/5/7 14:13
* Des: This is BindView
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClicks {
///< 资源id
int[] value();
}
基本的定义和用法就是酱紫,运行不了或者报错没有关系,别急;目前来讲我们还无法正常使用的,你什么都还没做了~~~至于value怎么被赋值(怎么被赋值这个感觉有点深,后面看看能不能看看源码,初步感觉应和@Target有关系,运行时应该是做了处理..),之后怎么获取value,怎么给tv赋值,涉及到反射,后面讲解.
还要搞清楚别的,不然萌萌的不好
int value();这里面的value可不可以改名称?当然可以,比如int viewId()/int[] viewIds(); 注解值定义如果只有一个定义的话,默认我们就用value, 这样使用时可以不用明确给变量赋值:
@BindView(value=R.id.xxxx), 这里value=可以省略;
而如果你用的默认不是value,而是viewId,那么需要:
@BindView(viewId=R.id.xxxx)
我亲自试验了才算明白一些事情,所以有些地方还是需要特别注意。不然使用起来一开始会出现很多问题…
贴几种多参数的定义,帮助下初识记忆
基本够用了….初识就到这里哈! 下一步我们说下反射,然后就可以实现另类版butterknife了…(butterknife并不是常规的简单反射或者动态代理,后面我们做初步分析)~~~回家休息几天!然后继续反射,这样也正好又可以总体回顾学习…