通过注解&反射技术实现View注入(Android)
1.在Activity中的应用
public class AnnotationReflectActivity extends AppCompatActivity {
@InjectView(R.id.tv_show)
TextView tvShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_annotation_reflect);
InjectUtils.injectView(this);//方法调用
tvShow.setText("tv show.");
}
}
2.注解
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectView {
@IdRes int value();
}
3.反射
public class InjectUtils {
public static void injectView(Activity activity) {
Class<? extends Activity> clazz = activity.getClass();
//clazz.getFields() 获得自己+父类的成员(父类不包括private,只是public)
//clazz.getDeclaredFields() 获得自己的成员
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
if(field.isAnnotationPresent(InjectView.class)) {
InjectView injectView = field.getAnnotation(InjectView.class);
//获得注解中设置的id
int id = injectView.value();
View view = activity.findViewById(id);
//设置访问权限,允许操作private属性
field.setAccessible(true);
try {
//反射赋值
field.set(activity, view);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
原文:https://www.cnblogs.com/heibingtai/p/13920251.html