注解实现布局 ,控件的赋值 ,点击事件

本文介绍了一种使用注解和反射技术实现视图绑定、点击事件绑定及布局设置的方法。通过自定义注解@ContentView、@BindView和@MyAnnotation,并借助InjectUtils工具类,简化了Android应用开发中常见的绑定操作。
 1.setContentView绑定
  //注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
public @interface ContentView {

    int value();
}



@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
2.实现控件绑定
public @interface BindView {
    int value();
}


/**
 * Created by lenovo on 2018/1/24.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Inherited
3.实现控件的点击事件绑定 
public @interface MyAnnotation {
    int value();//一个方法的时候,用value();
}




//注解的工具类


package com.bawei.com.reflection.zhujie;

import android.app.Activity;
import android.view.View;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by lenovo on 2018/1/24.
 */
//注解的工具类
public class InjectUtils {

    public static void inject(Activity activity) {


        injectContenView(activity);

        injectBindView(activity);

        injectMyonclickView(activity);


    }
	//注解点击事件
    private static void injectMyonclickView(final Activity activity) {
        //得到Activity字节码
         Class clazz = activity.getClass();
        try {
           final Method obcilck = clazz.getMethod("Obcilck", null);
            MyAnnotation annotation = obcilck.getAnnotation(MyAnnotation.class);
            if (annotation != null) {
                int value = annotation.value();
                 final View view = activity.findViewById(value);
                view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        try {
                            obcilck.invoke(activity);
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        } catch (InvocationTargetException e) {
                            e.printStackTrace();
                        }
                    }
                });

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
	
      //Textview的赋值
    private static void injectBindView(Activity activity) {
        //得到Activity字节码
        Class clazz = activity.getClass();
        //得到Activity的所有成员变量
        Field[] fields = clazz.getDeclaredFields();
        if (fields != null && fields.length > 0) {
            for (Field field : fields) {
                //设置权限
                field.setAccessible(true);
                //得到成员变量上面的注解

                BindView bindView = field.getAnnotation(BindView.class);
                if (bindView != null) {
                    //得到注解的值
                    int id = bindView.value();
                    //得到每个id的view
                    View view = activity.findViewById(id);
                    try {
                        //通过反射方法,初始化成员变量
                        field.set(activity, view);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

	//Activity的布局
    private static void injectContenView(Activity activity) {

        //得到Activity字节码
        Class clazz = activity.getClass();
        //得到类上面的注解
        ContentView contentView = (ContentView) clazz.getAnnotation(ContentView.class);
        if (contentView != null) {
            int layoutId = contentView.value();

            try {
                Method method = clazz.getMethod("setContentView", int.class);
                method.invoke(activity, layoutId);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}

//MainActiviy

package com.bawei.com.reflection.zhujie;


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;


import com.bawei.com.reflection.R;


@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {


    @BindView(R.id.tv1)
    TextView tv;




    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        InjectUtils.inject(this);
        indate();
    }




    private void indate() {
        tv.setText("dsadsadsadsad");


    }


  @MyAnnotation(R.id.btu)
    public void Obcilck(){
        Toast.makeText(this, "大萨达所", Toast.LENGTH_SHORT).show();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值