Android经验和架构Android进阶Android开发拾穗

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

有什么问题欢迎提出,版权所有,转载请注明出处!

上一篇下一篇

猜你喜欢

热点阅读