自定义注解绑定控件+点击事件

本文介绍了一种使用注解简化Android应用UI元素绑定及事件处理的方法。通过@ContentView、@BindView和@OnClick注解,可以自动设置内容视图、绑定视图元素并注册点击事件监听器,避免了手动findViewById和setOnClickListener的繁琐步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ContentView 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ContentView {
     int value();
}

BindView

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface BindView {
    int value();
}

OnClick

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnClick {
    int [] value();
}

MainActivity

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

    @BindView(R.id.test1)
    TextView textView;
    @BindView(R.id.img)
    ImageView mImageView;
    @BindView(R.id.test2)
    TextView textView1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Util.setContent(this);


        textView.setText("hahaha");
        textView1.setText("hehehe");
    }

    @OnClick(R.id.test1)
    public void aa() {
        Toast.makeText(MainActivity.this, "hehe", Toast.LENGTH_SHORT).show();
    }

    @OnClick(R.id.img)
    public void bb() {
        Toast.makeText(MainActivity.this, "haha", Toast.LENGTH_SHORT).show();
    }

    @OnClick(R.id.test2)
    public void cc() {
        Toast.makeText(MainActivity.this, "haha", Toast.LENGTH_SHORT).show();
    }

}

 

Util

public static void setContent(Activity activity) {
    setcontentview(activity);
    setbindview(activity);
    setonclick(activity);
}

public static void setcontentview(Activity activity) {
    Class clazz = activity.getClass();
    ContentView annotation = (ContentView) clazz.getAnnotation(ContentView.class);
    int value = annotation.value();
    try {
        Method method = clazz.getMethod("setContentView", int.class);
        method.invoke(activity, value);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void setbindview(Activity activity) {
    //获取类
    Class< ? extends Activity> recfClass=activity.getClass();
    //获取类中的所有field(域/变量)
    Field[] fields = recfClass.getDeclaredFields();
    //对获取到的field做遍历
    for(Field field:fields){
        //对遍历到的field做判断,是否带特定注解标识
        if(field.isAnnotationPresent(BindView.class)){
            //获取到该field的注解
            BindView bindView= field.getAnnotation(BindView.class);
            //获取到该field的注解的value
            int id= bindView.value();
            //设置属性
            field.setAccessible(true);
            try {
                //对该field做控件绑定操作
                field.set(activity,activity.findViewById(id));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
        }

    }

}

public static void setonclick(final Activity activity) {
    Class clazz = activity.getClass();//第一种方式
 /*   Class clazz2 = Activity.class;//第二种方式
    try {
        Class aClass = Class.forName("com.lixinyang.myreflect.MainActivity");//第三种方式
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }*/
    //获取到里面的所有方法
    Method[] methods = clazz.getMethods();
    //foueach进行循环遍历
    for (final Method method : methods) {
        OnClick click = method.getAnnotation(OnClick.class);//通过反射api获取方法上面的注解
        if (click != null) {
            int[] value = click.value();
            for (int i : value) {
                if (i == -1) return;
                View view = activity.findViewById(i);//通过注解的值获取View控件
                if (view == null) return;
                view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        try {
                            method.invoke(activity);//通过反射来调用被注解修饰的方法
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
            }

        }
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值