Android开发过程中,最常用的操作就是findViewById,长长的一串使人不禁想到JavaScript当中的document.getElementById,findViewById虽然字更少,但是麻烦的是需要转型。那么有没有一种方法,可以写得更少,又不用转型呢。
启发我的是jQuery对DOM的操作,一个$符号就完成了,然后我想,findViewById也是一个符号搞定,那势必很爽。于是就出现了第一个版本:
public View $(int id){
return super.findViewById(id);
}
这样使用起来已经有一定程度的简化了:
TextView tv = (TextView) $(R.id.textView);
但是那讨厌的转型还是存在。如果能在方法内部完成转型后返回,那势必更爽,于是想到使用Java中的泛型:
public <T extends View> T $(int id){
View v = null;
try {
v = super.findViewById(id);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
return (T) v;
}
这样使用起来就顺眼和简单多了:
TextView tv = $(R.id.textView);
可是仍然不满足,传入的参数太长,而且R.id都是重复的,如果能只写id后面的内容(也就是在XML文件中定义时写的内容),不是能更进一步简化代码吗?
这里用到了反射,就不讲原理了,直接上代码:
public <T extends View> T $(String name){
View v = null;
try {
v = findViewById(R.id.class.getField(name).getInt(null));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return (T) v;
}
使用起来自然是简单粗暴:(看上去也更像jQuery)
TextView textView = $("textView");