findViewById的另类效率写法

作者: a57ecf3aaaf2 | 来源:发表于2016-05-09 21:04 被阅读2561次

在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

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

相关文章

网友评论

  • a57ecf3aaaf2:在最新的 Android SDK 中已经官方支持泛型模式调用 findViewById 了,大家可以直接使用。
  • BKQ_SYC:用在fragment中还是需要类型转换
    a57ecf3aaaf2:@frag 不需要
  • MeGaTr33:这个写法去年从@jude95那看到过~用$符号代替findviewbyid方法
    MeGaTr33:@Fynn_ 对啊,就是泛型那种写法。就是我觉得把函数名写成$符号这一做法挺有辨识度,毕竟一般人起函数名也都是字母啊
    a57ecf3aaaf2:@谷地仁波切 这里主要是泛型,方法名可以随便改。
  • 修得养得梦得过得:这个思路漂亮
  • 08a80639d366:可以的
  • HuDP:赞一个
  • 湫水长天:在android studio里面,fv再加一个回车就能写findviewbyid……

    如果是装逼就当我什么都没说……
    Waikey:@小心大熊猫 可以在Setting 里调
    HuDP:@小心大熊猫 多一种思路
  • 67d75c11e8a3:写法类似于CommonViewHolder 引用泛型来简化代码,但是其实实际上对性能的什么消耗 觉得并没有省去太多的占用。
  • Op_turbo:吓到我了。。
    Op_turbo:@Fynn_ 思路很独特
    a57ecf3aaaf2:@Pikooop ?
  • 小九九留:震惊了
    小九九留:@Fynn_ 哈哈。。。
    a57ecf3aaaf2:@渔舟唱晚馨 :joy:
  • 240b50cbfcf3:原理是啥,$是干嘛用的,第一次看到这种写法 :flushed:
    a57ecf3aaaf2:@T摩天倫 那是方法名啊,你可以改成其他的,这样做是为了简化。
  • 晨鸣code:赞一个
  • 看赏:感谢分享。推荐一篇原创文章【我有一位作死的女下属】http://www.jianshu.com/p/2fc5d2e17136# 看神秘女编辑是如何玩转领导?!欢迎阅读并且聊聊,你身边的奇葩人/事!
  • 临岁之寒:确实是个好办法
  • 李斯维:这种findViewById 很早就已经在使用了,不过最后一个 $ 符号也能当函数名?!?!
    震惊了!
    a57ecf3aaaf2:@545a3c856c5f :smile:
    李斯维:@Fynn_ 唉~~,猛然感觉到写代码写久了,思想都变得僵硬。看来我是时候再去看看java基础,重拾初心了。
    a57ecf3aaaf2:@545a3c856c5f 这是java语言中方法名支持的符号之一。
  • OvenChou:lz 666
  • nums:可以看下kotlin,不需要用findViewById
    a57ecf3aaaf2:@做IT的小丫头 好的,感谢
  • 随浪:收录,学习
  • 好饼哥:学到了 很好
  • 叨叨叨_:第一次见。不过在子activity中要用的时候估计也经常要做下类型转换
    a57ecf3aaaf2:@咸鱼君 不用啊
  • 灰灰手记:不错,有创意 :+1:
  • ConnorLin:点个赞

本文标题:findViewById的另类效率写法

本文链接:https://www.haomeiwen.com/subject/ebmerttx.html