能实现自动给控件赋值的库包括xutils和butterknife等。前几天复习了下反射,想自己实现类似的功能。水平有限,简单一个方法,供大家参考。
思路
1.获取activity的所有属性,
2.检查属性是否有Inject这样一个注解,
3.有,获取注解中的id,
4.通过activity.findViewById(id)找到该View,赋值给该属性。
自定义注解类Inject:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Inject {
int value();
}
注解工具类
public class ViewInject {
public static void inject(Activity activity) {
Class<? extends Activity> aClass = activity.getClass();
Field[] declaredFields = aClass.getDeclaredFields();//1.获取activity的所有属性,
for (int i = 0; i < declaredFields.length; i++) {
Field declaredField = declaredFields[i];
Inject inject = declaredField.getAnnotation(Inject.class);//2.检查属性是否有Inject这样一个注解。
if (inject != null) {//3.有
int id = inject.value();//3.获取注解中的id
View view = activity.findViewById(id);//4.找到该View
try {
if (!declaredField.isAccessible()) {
declaredField.setAccessible(true);
}
declaredField.set(activity, view);//4.赋值给该属性
} catch (Exception e) {
throw new RuntimeException("type cast exception");
}
}
}
}
}
在Activity中使用
public class MainActivity extends AppCompatActivity {
@Inject(R.id.tv)
private TextView textView;
@Inject(value = R.id.tv2)
private TextView textView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewInject.inject(this);
textView.setText("abc");
textView2.setText("你好");
}
}
使用该方法实现了自动给控件赋值的功能。
网友评论