Android使用ViewStub实现布局优化方法示例

 更新时间:2022年08月26日 10:40:10   作者:芝麻粒儿  
这篇文章主要为大家介绍了Android使用ViewStub实现布局优化方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

👉实践过程

Hello,大家好啊,我是小空,今天带大家了解下动态加载控件ViewStub。

在平时开发中经常会遇到复杂布局,而每一个view都是会占据内存和消耗cpu的(即使再小,累计成多,一般嵌套7级以上就有明显的卡顿了),布局优化就是我们常做的任务之一,甚至是一块心病。所以我们工作中就要留意布局优化的手段,ViewStub就是其中之一。

大家应该听过merge标签,将某个布局文件的根布局写成merge的,然后对应的布局include引用,会默认不会引入merge帮我们减少一层嵌套。而ViewStub也是类似的实现,区别在于include的merge就已经在view的树结构中了,而viewstub默认没在树中,只有代码调用初始化的时候才会进入树中。

就好比我们排队,前者是两人同时排队,后者是一个人排队拿着个占位的牌子帮另一人占位,等合适的时机再将另一个人插入进来,牌子拿开。

😜实现方式

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <Button
       android:id="@+id/idBtnInflate"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="inflate" />
    <ViewStub
        android:id="@+id/viewStubName"
        android:inflatedId="@+id/inflatedLayoutName"
        android:layout="@layout/yourLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

布局中ViewStub其实就是个宽高全是0的View,它默认是不可见的(不是GONE或INVISIBLE的不可见,而是根本没在view的树结构里),然后通过调用setVisibility函数或者Inflate函数会将我们的目标布局给加载出来,这样就实现了延迟加载的效果。

idBtnInflate.setOnClickListener{
    viewStubName. inflate()
    //或者是下面的形式加载,因为里面会执行inflate
    // viewStubName.visibility=View.VISIBLE
}

😜知识点

注意,viewstub执行inflate函数后,在当前页面activity未销毁之前无法进行第二次inflate。

为什么第二次inflate的时候会报错呢?仔细看上面列举的排队比喻,viewstud就是占位的那个牌子,当你引入的layout插进去后就会移除viewstub控件。那么下次你再进行inflate的时候自然就是报错了。

为什么大小为0且不绘制? 我们找到ViewStub的源码:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(0, 0);
}
@Override
public void draw(Canvas canvas) {
}
@Override
protected void dispatchDraw(Canvas canvas) {
}
public void setWillNotDraw(boolean willNotDraw) {
    setFlags(willNotDraw ? WILL_NOT_DRAW : 0, DRAW_MASK);
}

重写draw和dispatchDraw,但却什么也不写,再接着onMeasure中进行setMeasuredDimension(0,0);就实现了宽高为0.

而不绘制是将view的Flags设置为了WILL_NOT_DRAW,这个值的作用是view不会进行onDraw方法。

顺便一提:在当下设备性能越来越好的背景下,关于优化的事情放在开发周期后面再说吧。先出产品再迭代。随着经验的积累,正常开发你也会留意性能优化,随手就解决了。

以上就是Android使用ViewStub实现布局优化方法示例的详细内容,更多关于Android ViewStub布局优化的资料请关注脚本之家其它相关文章!

相关文章

  • Android实现手机联系人分栏效果

    Android实现手机联系人分栏效果

    这篇文章主要为大家详细介绍了Android实现手机联系人分栏效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Android开发者常见的UI组件总结大全

    Android开发者常见的UI组件总结大全

    Android开发中UI组件是构建用户界面的基本元素,下面这篇文章主要给大家介绍了关于Android开发者常见的UI组件总结的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • Android Camera2采集摄像头原始数据

    Android Camera2采集摄像头原始数据

    这篇文章主要介绍了Android Camera2采集摄像头原始数据并进行手工预览的功能实现原理以及代码分析,需要的朋友学习下吧。
    2018-02-02
  • Android神兵利器之Image Asset Studio的实现

    Android神兵利器之Image Asset Studio的实现

    这篇文章主要介绍了Android神兵利器之Image Asset Studio的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • android实现筛选菜单效果

    android实现筛选菜单效果

    这篇文章主要为大家详细介绍了android实现筛选菜单效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 蓝牙原理Android代码实现

    蓝牙原理Android代码实现

    这篇文章主要为大家详细介绍了蓝牙原理Android代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • android nfc常用标签读取总结

    android nfc常用标签读取总结

    NFC(Near Field Communication,近场通信)是一种数据传输技术这篇文章主要介绍了android nfc常用标签读取总结,有兴趣的可以了解一下。
    2016-12-12
  • Android实现可拖拽的GridView效果长按可拖拽删除数据源

    Android实现可拖拽的GridView效果长按可拖拽删除数据源

    这篇文章主要介绍了Android实现可拖拽的GridView效果长按可拖拽删除数据源,要实现的基本功能是长按,移到垃圾桶,删除数据,需要的朋友可以参考下
    2017-12-12
  • Android studio 禁用AndroidX方式

    Android studio 禁用AndroidX方式

    这篇文章主要介绍了Android studio 禁用AndroidX方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 手势滑动结束Activity基本功能的实现(一)

    手势滑动结束Activity基本功能的实现(一)

    这篇文章主要为大家详细介绍了手势滑动结束Activity基本功能的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论