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布局优化的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android布局技巧之使用ViewStub

    多亏了<include />标签,在Android里,很容易就能做到共享和重用UI组件.在Android开发中,很容易就能创建出复杂的UI结构,结果呢,用了很多的View,且其中的一些很少使用.针对这种情况,谢天谢地,Android还为我们提供了一个特别的构件--ViewStub,它可以使你充分享受<include />的好处而不会造成无用View的浪费. ViewStub是一个看不见的,轻量级的View.它没有尺寸,也不会绘制以及以某种形式参与到布局中来.这意味着ViewStub

  • Android布局技巧之include、merge与ViewStub标签的巧用

    前言 在开发中UI布局是我们都会遇到的问题,随着UI越来越多,布局的重复性.复杂度也会随之增长. 相信大家经常听到include.merge.ViewStub这样的标签,官方也提到这三种布局可用于布局的优化.今天就介绍下这三种布局的使用,记录下来,便于后续app中的使用. include布局重用 app开发过程中,会遇到不同页面里有相同的布局,这时我们可以将这些通用的布局提取出来到一个单独的layout文件里,再使用<include>标签引入到相应的页面布局文件里,主要通过include的la

  • Android中使用ViewStub实现布局优化

    在Android开发中,View是我们必须要接触的用来展示的技术.通常情况下随着View视图的越来越复杂,整体布局的性能也会随之下降.这里介绍一个在某些场景下提升布局性能的View,它就是ViewStub. ViewStub是什么 ViewStub是View的子类 它不可见,大小为0 用来延迟加载布局资源 注,关于Stub的解释 A stub is a small program routine that substitutes for a longer program, possibly to

  • Android抽象布局——include、merge 、ViewStub详解

    在布局优化中,Androi的官方提到了这三种布局<include />.<merge />.<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一下他们的优势,以及怎么使用,记下来权当做笔记. 1.布局重用<include /> <include />标签能够重用布局文件,简单的使用如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/re

  • Android在layout xml中使用ViewStub完成动态加载问题

    一.Layout XML文件常见的两种模块加载方式 1.静态加载:被加载的模块和其它模块加载的时间一样. <include layout="@layout/otherLayout"/> 2.动态加载:需要被加载的模块初始时并没有被加载进内存,在你需要加载这个模块才会被动态的加载进去. <ViewStub android:layout="@layout/otherLayout"/> 还要把layout width和height加上 二.View

  • Android组件ViewStub基本使用方法详解

    ViewStub可以在运行时动态的添加布局.帮助文档给定的定义是: "A ViewStub is an invisible, zero-sized View that can be used to lazily inflate layout resources at runtime. When a ViewStub is made visible, or when inflate() is invoked, the layout resource is inflated. The ViewStu

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

    目录 实践过程 实现方式 知识点 实践过程 Hello,大家好啊,我是小空,今天带大家了解下动态加载控件ViewStub. 在平时开发中经常会遇到复杂布局,而每一个view都是会占据内存和消耗cpu的(即使再小,累计成多,一般嵌套7级以上就有明显的卡顿了),布局优化就是我们常做的任务之一,甚至是一块心病.所以我们工作中就要留意布局优化的手段,ViewStub就是其中之一. 大家应该听过merge标签,将某个布局文件的根布局写成merge的,然后对应的布局include引用,会默认不会引入merg

  • Android中ListView Item布局优化技巧

    本文实例讲述了Android中ListView Item布局优化技巧.分享给大家供大家参考,具体如下: 之前一直都不知道ListView有多种布局的优化方法,只能通过隐藏来实现,自己也知道效率肯定是很低的,但是也不知道有什么方法,这些天又查了一些资料,然后知道 其实google早就帮我们想好了优化方案了. 假设你的ListView Item有三种布局样式的可能:就比如很简单的显示一行字,要靠左,居中,靠右. 这时我们就可以在BaseAdapter里面重写两个方法: private static

  • Android轻松实现多语言的方法示例

    本文介绍了Android轻松实现多语言的方法示例,分享给大家,具体如下: 1.创建多语言包 2.首先在onCreate方法中调用此方法查看上一次保存的是什么语言 public void setLanguage() { //根据读取到存放在sp里面的数据 进行设置 Configuration configuration = getResources().getConfiguration(); SharedPreferences sharedPreferences = getSharedPrefer

  • Android P实现静默安装的方法示例(官方Demo)

    Android9.0无法通过以下两种方式实现静默安装: 1.runtime执行shell cmd 2.PackageInstall 反射机制 但是Google已经给我们推荐了相关的APIDemos,所以建议大家多看看源码~ 在frameworks/base/core/java/android/content/pm/PackageInstaller.java有段关于该类的介绍: The ApiDemos project contains examples of using this API: <c

  • Android自定义流式布局的实现示例

    在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何自定义一个类似热门标签那样的流式布局.下面我们就来详细介绍流式布局的应用特点以及用的的技术点. 1.流式布局的特点以及应用场景 特点:当上面一行的空间不够容纳新的TextView时候,才开辟下一行的空间. 原理图: 场景:主要用于关键词搜索或者热门标签等场景 2.自定义ViewGroup (1)onMeasure:测量子view的宽高,设置自己的宽和高 (2)onLayout:设置子

  • java9新特性Collection集合类的增强与优化方法示例

    目录 一.提供of()方法创建集合 1.1.构建Set集合对象 1.2.构建List集合对象 1.3.构建Map对象 1.4.使用Map.ofEntries()和Map.entry() 二.Arrays 2.1.Arrays.mismatch() 2.2.Arrays.equals() 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 写成一系列的

  • Android开发之计算器GridLayout布局实现方法示例

    本文实例讲述了Android开发之计算器GridLayout布局实现方法.分享给大家供大家参考,具体如下: 运行效果: Demo 下载地址:https://github.com/LonglyWolf/Calculator 或者点击此处本站下载. 按钮布局实现: 一个Linearlayout 嵌套三个TextView 最下方的显示当前计算式.上面为先前的计算式. Gridview 网格布局排布按钮 <?xml version="1.0" encoding="utf-8&q

  • Android编程实现播放音频的方法示例

    本文实例讲述了Android编程实现播放音频的方法.分享给大家供大家参考,具体如下: 在 Android 中播放音频文件一般都是使用 MediaPlayer 类来实现的,它对多种格式的音 频文件提供了非常全面的控制方法,从而使得播放音乐的工作变得十分简单.下表列出了 MediaPlayer 类中一些较为常用的控制方法. 方法名 功能描述 setDataSource() 设置要播放的音频文件的位置. prepare() 在开始播放之前调用这个方法完成准备工作. start() 开始或继续播放音频.

  • Android编程实现抽屉效果的方法示例

    本文实例讲述了Android编程实现抽屉效果的方法.分享给大家供大家参考,具体如下: 今天在手机上实现了抽屉效果,其实很简单,但是效果却很酷. 首先在layout 下设置xml布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:l

随机推荐