目前流行的注解给view赋值的框架很多,可以参考比较下:http://blog.csdn.net/p892848153/article/details/50433279
大体上说,就是在运行时,使用java的注解技术,动态去获取contentview中的指定id的view对象,然后,赋值给这个view。
如androidannotations框架的用法
@ViewById(R.id.three_d_view) Roll3DView tdView;
有个ViewById的注解类,里边有个
int value() default 0;这样的注解属性,然后这个就是R.id.XXXX的十六进制值了。
以下详细案例来自
zhangyuChen1991 / Roll3DImageView
github动画旋转案例:
具体的使用方法如下:
首先定义注解类型,这个是运行时,作用在定义在字段上边的注解
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 用于findView的注解 * Created by zhangyu on 2016-07-11 11:04. */ @Target(ElementType.FIELD) //表示用在字段上 @Retention(RetentionPolicy.RUNTIME) //表示其生命周期是运行时 public @interface ViewInject { int value() default 0; }
其次,定义了注解,就得获取注解,然后动态赋值
import android.app.Activity; import java.lang.reflect.Field; /** * View注解工具 * Created by zhangyu on 2016-07-11 15:15. */ public class ViewInjectUtil { private static final String TAG = "ViewInjectUtil"; public static void injectView(Activity activity){ try { Field[] fields = activity.getClass().getDeclaredFields(); //获取类中声明的字段 for (Field field : fields) { boolean isAnnotationPresent = field.isAnnotationPresent(ViewInject.class); //字段是否关联注解 if(isAnnotationPresent){ ViewInject viewInject = field.getAnnotation(ViewInject.class); //获取所关联的注解 field.setAccessible(true); field.set(activity,activity.findViewById(viewInject.value())); //为字段设置findViewById值 } } } catch (IllegalAccessException e) { e.printStackTrace(); } } }
具体使用细节:
在定义view对象的时候,声明下注解,绑定哪个viewid,然后就不需要一个个手动findViewById()了
@ViewInject(R.id.debug_btn) private Button debugBtn;
看到了这里,是不是很简单呢。
这个只是查找view,给view自动赋值的用法,像androidannotations,还有@AfterInject,@Click({R.id.x1,R.id.x2})等用法,
原理也是和这个类似,有兴趣可以多研究前辈们的源码风格和原理,汲取有利自身的营养。
简单的小计一下,本文完!