最近突发奇想,每次new 一个AndroidProject之后就要开始繁琐的布局,找控件啊,先要定义控件,然后findViewById之后,开始赋值啊,什么的,那么烦的一套完成之后代码已经很多行了,我就在想可不可以简化一下那?有的说用框架,最近那么流行的几大android框架可以注解啊什么的,很轻松的就实现了,可是你们只知道用它,不知道怎么实现的,那么问题来了,如何自己写一个那,很简单。。。。。话不多说,直接上代码!!!!!!!
这里面就用到了一个接口,一个工具类,放在自己的项目当中,直接调用就好了,不用再导包什么的。。。。
/**
*
* @author thinkwyp
*
*/
public class MainActivity extends Activity {
//这里对应的xml里面控件的id
@CreateView(value = "text1")
//这是与上面对应的控件类型
private TextView text1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
//只需要这么一句话就可以轻松的实现控件的寻找
Utils.injectObject(this, this,R.id.class);
} catch (Exception e) {
e.printStackTrace();
}
//后面只管对控件进行操作了
text1.setText("哈哈还不行啊");
}
}
这是主的activity,里面用到的@CreateView其实是一个接口,上代码
/**
*
* @author thinkwyp
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CreateView {
String value();
}
这个接口就是这么简单。。。。。。
然后具体的实现还是在后面这个工具类中,直接上代码,请注意。。
/**
*
* @author thinkwyp
*
*/
public class Utils {
public static void injectObject(Object obj, Activity activity, Class idClass)
throws Exception {
Class<?> classType = obj.getClass();
Field[] fields = classType.getDeclaredFields();
for (int i = 0; fields != null && i < fields.length; i++) {
Field field = fields[i];
if (field.isAnnotationPresent(CreateView.class)) {
CreateView annotation = field.getAnnotation(CreateView.class);
String name = annotation.value();
if (TextUtils.isEmpty(name)) {
continue;
}
int id = findId(name, idClass);
if (id <= 0) {
continue;
}
View v = activity.findViewById(id);
if (v != null) {
field.setAccessible(true);
field.set(obj, v);
}
}
}
}
public static int findId(String idName, Class r)
throws IllegalArgumentException, IllegalAccessException {
Class c = r;
Field[] fields = c.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String name = field.getName();
if (name.equalsIgnoreCase(idName)) {
int id = field.getInt(name);
return id;
}
}
return 0;
}
}
这个工具类实现可能有点复杂,但是还是可以接受的。。。
开发android好轻松第一课就这样结束了。。。。多多关注,以后会有更多的,嘿嘿