注解类
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectView {
@IdRes int value();//IdRes 语法检查,限制输入类型
// String name();
}
//通过映射findViewById
public class InjectUtils {
public static void injectView(Activity activity){
Class<? extends Activity> cls = activity.getClass();//反射是基于class
cls.getFields();//获得自己和父类的成员(不包括private,只能是public)
cls.getDeclaredFields();//只能获得自己的成员(不包括父类),所有作用域
Field[] fields = cls.getDeclaredFields();//获取此类所有的成员
for (Field field : fields){
//如果是true,被injectView打上了标签
if (field.isAnnotationPresent(InjectView.class)){
InjectView injectView = field.getAnnotation(InjectView.class);//获取标签
int id = injectView.value();//获取标签的id值,如果取name,直接injectView.name();
View view = activity.findViewById(id);
//反射设置属性的值
field.setAccessible(true);//设置反射的权限,允许修改private的属性
try {
field.set(activity,view);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
应用
public class MainActivity extends AppCompatActivity {
@InjectView(R.id.tv_name)
private TextView tvName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InjectUtils.injectView(this);
tvName.setText("zhhesjs j");
}
}