Android注解实现简单的View注解功能,只实现了setContentView和findViewById功能.

本文介绍了一种使用自定义注解简化Android应用程序视图绑定的方法,通过创建VIewById和LayoutById注解,结合反射技术实现findViewById和setContentView功能,提高开发效率。
最近在学怎么使用注解,所以用注解写了一个仿xUtils3的View注解功能,只实现了setContentView和findViewById功能.
首先我们创建一个VIewById接口


```
package com.example.viewinject;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)          //Target放在哪里
@Retention(RetentionPolicy.RUNTIME) //什么时候起作用 RUNTIME运行时 CLASS编译时 SOURCE 源码编程阶段
public @interface ViewById {
    int value();
}

```
这里interface加上@代表这是个注解
上面两个参数的解释在下面
	@Retention:注解的保留位置         

@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
    @Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
    @Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
  @Target:注解的作用目标
    @Target(ElementType.TYPE) //接口、类、枚举
    @Target(ElementType.FIELD) //字段、枚举的常量
    @Target(ElementType.METHOD) //方法
    @Target(ElementType.PARAMETER) //方法参数
    @Target(ElementType.CONSTRUCTOR) //构造函数
    @Target(ElementType.LOCAL_VARIABLE)//局部变量
    @Target(ElementType.ANNOTATION_TYPE)//注解
    @Target(ElementType.PACKAGE) ///包
然后我们创建一个LayoutById

```
package com.example.viewinject;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)          //Target放在哪里
@Retention(RetentionPolicy.RUNTIME) //什么时候起作用 RUNTIME运行时 CLASS编译时 SOURCE 源码编程阶段
public @interface LayoutById {
    int value();
}
```
接下来我们在Activity中使用它们


```

@LayoutById(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
    @ViewById(R.id.tv)
    private TextView tv;

    @ViewById(R.id.tv1)
    private TextView tv1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ViewInject.inject(this);

        tv.setText("ViewById");
        tv1.setText("ViewById1");

    }
}
```
接下来我们主要看看VIewInject类

```
	public class ViewInject {

    public static void inject(Activity activity) {
        initLayout(activity);
        initView(activity);
    }

    private static void initLayout(Activity activity) {
        //1.过滤关于LayoutById的属性
        LayoutById layoutById = activity.getClass().getAnnotation(LayoutById.class);
        if(layoutById != null){
            //2.调用setContentView
            activity.setContentView(layoutById.value());
        }
    }

    private static void initView(Activity activity){
        //1.获取所有的属性
        Field[] fields = activity.getClass().getDeclaredFields();
        //2.过滤关于ViewById的属性
        for (Field field : fields) {
            ViewById viewById = field.getAnnotation(ViewById.class);
            if (viewById != null){
                //3.findViewById
                View view = activity.findViewById(viewById.value());
                //4.反射注入
                field.setAccessible(true);
                try {
                    field.set(activity,view);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
```
这里主要是通过反射获取属性去过滤,得到我们想要的属性去设置结果.
这个例子是比较简单的,初学者可以参考下,谢谢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值