findViewById的另类效率写法
2016-05-09 本文已影响2561人
a57ecf3aaaf2
在Android中最常见的代码,莫过于findViewById了,通过findViewById能够直接引用资源文件中的View,但是资源文件中View过多会导致findViewById的重复使用,代码冗余过大。
很多开源框架使用注解的方式来解决这一问题,但是注解通常会带来性能损耗,而且在Android Studio中并不乐观,可能导致引用的资源id无法识别,因为在Android Studio中作为库项目中的资源id不是static的,无法通过switch...case来使用,也不能通过注解引用。
库项目中资源id引用出错为了简化findViewById的写法,我们可以这样做:
public final class ViewUtils {
private ViewUtils() {
//throw exception
}
/**
* Look for a view with the given id.
*
* @param object
* @param id
* @param <V>
* @return
*/
public static <V extends View> V findViewById(Object object, int id) {
if (object instanceof View) {
return (V) ((View) object).findViewById(id);
} else if (object instanceof Activity) {
return (V) ((Activity) object).findViewById(id);
} else if (object instanceof Window) {
return (V) ((Window) object).findViewById(id);
} else if (object instanceof Fragment) {
return (V) ((Fragment) object).getView().findViewById(id);
}
return null;
}
}
BaseActivity的基类中这样写:
public <E extends View> E $(int resId) {
return ViewUtils.findViewById(this, resId);
}
在子类ChildAcitivity中直接调用$()方法即可轻松引用资源id,并且无需做类型转换:
@Override
public void initViews() {
bnbTab = $(R.id.bnb_tab);
...
}
通过在方法中使用泛型,避免了每次进行类型转换,简化了代码,也提高了开发效率。
作者 @fynn
有什么问题欢迎提出,版权所有,转载请注明出处!