/**
* Created by Michael on 2019/12/17.
* @interface代表注解
*/
@Target(ElementType.FIELD) //放到哪里,这里代表放到属性上面
@Retention(RetentionPolicy.RUNTIME) //什么时候起作用 .RUNTIME运行时 .CLASS编译时
public @interface ViewById {
int value();
}
@interface代表声明一个注解,注解只是一个标识
使用注解:
public class MainActivity extends AppCompatActivity {
@ViewById(R.id.tv)
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewUtils.inject(this);
tv.setText("hello lzy!");
}
}
如果不加ViewUtils.inject(),会报错,说明注解只是一个标识,我们还需要进行处理:
public class ViewUtils {
public static void inject(Activity activity) {
//获取activity的所有属性
Field [] fields = activity.getClass().getDeclaredFields();
//过滤关于ViewById的属性
for (Field f:fields) {
ViewById viewById = f.getAnnotation(ViewById.class);
if (viewById != null){
View view = activity.findViewById(viewById.value());
f.setAccessible(true);
try {
//设置属性值
f.set(activity,view);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
来源:CSDN
作者:AD钙奶-lalala
链接:https://blog.csdn.net/qq_36428821/article/details/103581437