Android-让注解帮你简化代码,彻底抛弃findViewById

我们相信要获得这个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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值