最近在学怎么使用注解,所以用注解写了一个仿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();
}
}
}
}
}
```
这里主要是通过反射获取属性去过滤,得到我们想要的属性去设置结果.
这个例子是比较简单的,初学者可以参考下,谢谢
本文介绍了一种使用自定义注解简化Android应用程序视图绑定的方法,通过创建VIewById和LayoutById注解,结合反射技术实现findViewById和setContentView功能,提高开发效率。

314

被折叠的 条评论
为什么被折叠?



