我们相信要获得这个View的实例是要通过findViewById这个方法,而这个操作其实是很烦躁的,今天要用的是通过注解的方式来简化这一个复杂的步骤。
1、我们究竟该如何自定义我们想要的注解呢?其实很简单,直接看代码:
新建BindView.java,代码如下:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindView {
int id();
boolean click() default false;
}
@Target的意思是我们注解作用的目标,这里是ElementType.FIELD,也就是作用于字段的
ElementType的类型有以下几种:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述字段
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention的意思是注解的运行级别
RetentionPolicy的类型有以下几种
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
@interface则是表明这个类是一个注解,@号不能漏掉,否则变成了接口了
定义好了注解,如果我们直接来使用,是没有任何效果的,因为注解只是一段代码,并没有关联上我们的控件,所以我们要编写一个工具类来做关联
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.View;
import java.lang.reflect.Field;
public class BindUtils {
public BindUtils() {
}
public static void initBindView(Object currentClass, View sourceView) {
Field[] fields = currentClass.getClass().getDeclaredFields();
if (fields != null && fields.length > 0) {
Field[] var6 = fields;
int var5 = fields.length;
for (int var4 = 0; var4 < var5; ++var4) {
Field field = var6[var4];
BindView bindView = field.getAnnotation(BindView.class);
if (bindView != null) {
int viewId = bindView.id();
boolean clickLis = bindView.click();
try {
field.setAccessible(true);
if (clickLis) {
sourceView.findViewById(viewId).setOnClickListener((View.OnClickListener) currentClass);
}
field.set(currentClass, sourceView.findViewById(viewId));
} catch (Exception var11) {
var11.printStackTrace();
}
}
}
}
}
public static void initBindView(Activity aty) {
initBindView(aty, aty.getWindow().getDecorView());
}
public static void initBindView(View view) {
Context cxt = view.getContext();
if(cxt instanceof Activity) {
initBindView((Activity)cxt);
} else {
Log.d("BindUtils.java", "the view don\'t have root view");
}
}
@TargetApi(11)
public static void initBindView(Fragment frag) {
initBindView(frag, frag.getActivity().getWindow().getDecorView());
}
}
举一个简单的例子,利用上面的代码,加上在MainActivity.java通过点击button改变textview的内容:
public class MainActivity extends Activity implements View.OnClickListener {
private static final String TAG = "MainActivity";
@BindView(id = R.id.btn, click = true)
private Button btn;
@BindView(id = R.id.tv)
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BindUtils.initBindView(this);// 一定要放在setContentView后
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
Log.i(TAG, "点击了....");
tv.setText("绑定成功");
break;
}
}
}