前言

使用ViewStub可以实现界面的延迟加载。

1. ViewStub简单应用

布局文件,layout为加载ViewinflatedId为加载后Viewid

<ViewStubandroid:id="@+id/view_stub"android:layout_width="match_parent"android:layout_height="wrap_content"android:inflatedId="@+id/tv_inflate"android:layout="@layout/view_stub_inflate"/>

view_stub_inflate.xml文件

<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="view_stub_inflate" />

加载

  • inflate()方法

    ViewStub viewStub = findViewById(R.id.view_stub);
    if (mTvInflate == null) {mTvInflate = (TextView) viewStub.inflate();
    }
    
  • setVisibility()方法
    ViewStub viewStub = findViewById(R.id.view_stub);
    if (viewStub.getVisibility() != View.VISIBLE) {viewStub.setVisibility(View.VISIBLE);
    }
    

2. ViewStub解析

ViewStub在构造函数内,获取id, inflatedIdlayout,并设置为不可见。

public ViewStub(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context);final TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ViewStub, defStyleAttr, defStyleRes);mInflatedId = a.getResourceId(R.styleable.ViewStub_inflatedId, NO_ID);mLayoutResource = a.getResourceId(R.styleable.ViewStub_layout, 0);mID = a.getResourceId(R.styleable.ViewStub_id, NO_ID);a.recycle();setVisibility(GONE);setWillNotDraw(true);
}

inflate()方法会解析layout,并替代当前ViewStub的位置。

public View inflate() {final ViewParent viewParent = getParent();if (viewParent != null && viewParent instanceof ViewGroup) {if (mLayoutResource != 0) {final ViewGroup parent = (ViewGroup) viewParent;final View view = inflateViewNoAdd(parent);replaceSelfWithView(view, parent);mInflatedViewRef = new WeakReference<>(view);if (mInflateListener != null) {mInflateListener.onInflate(this, view);}return view;} else {throw new IllegalArgumentException("ViewStub must have a valid layoutResource");}} else {throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent");}
}// 解析layout,并设置ID
private View inflateViewNoAdd(ViewGroup parent) {final LayoutInflater factory;if (mInflater != null) {factory = mInflater;} else {factory = LayoutInflater.from(mContext);}final View view = factory.inflate(mLayoutResource, parent, false);if (mInflatedId != NO_ID) {view.setId(mInflatedId);}return view;
}// 代替当前ViewStub的位置
private void replaceSelfWithView(View view, ViewGroup parent) {final int index = parent.indexOfChild(this);parent.removeViewInLayout(this);final ViewGroup.LayoutParams layoutParams = getLayoutParams();if (layoutParams != null) {parent.addView(view, index, layoutParams);} else {parent.addView(view, index);}
}

setVisibility()方法,先判断mInflatedViewRef是否为空,也就是有没有调用过inflate()方法。

public void setVisibility(int visibility) {if (mInflatedViewRef != null) {View view = mInflatedViewRef.get();if (view != null) {view.setVisibility(visibility);} else {throw new IllegalStateException("setVisibility called on un-referenced view");}} else {super.setVisibility(visibility);if (visibility == VISIBLE || visibility == INVISIBLE) {inflate();}}
}

Android ViewStub控件相关推荐

  1. android listview viewstub,Android布局优化之ViewStub控件

    ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...

  2. Android神奇“控件”-----RemoteViews

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请注明 http://blog.csdn.net/wrg_20100512/article/details/53940485 好 ...

  3. Android开源控件ViewPager Indicator的使用方法

     1月16日厦门 OSC 源创会火热报名中,奖品多多哦   摘要 Android开源控件ViewPager Indicator的使用介绍 ViewPagerIndicator 目录[-] 1. V ...

  4. 日历控件的android代码,Android日历控件PickTime代码实例

    Android日历控件PickTime代码实例 发布时间:2020-10-03 16:05:51 来源:脚本之家 阅读:86 作者:手撕高达的村长 最近做项目,需要设置用户的生日,所以做这样一个功能. ...

  5. android 获取控件高度_安卓开发入门教程UI控件_ImageView

    什么是ImageView ImageView是用于显示图片的UI控件. 基础样例 1.展示本地图片 效果图 代码 <ImageViewandroid:layout_width="wra ...

  6. xamarin.android 控件,Android 库控件 - Xamarin | Microsoft Docs

    Xamarin Android 库控件Xamarin.Android Gallery control 03/15/2018 本文内容 Gallery是一种布局小组件,用于显示水平滚动列表中的项,并将当 ...

  7. android 获取控件在屏幕中的坐标

    今天,简单讲讲android如何获取控件在屏幕中的坐标. 这个其实也很简单,但是昨天做一个功能时,需要功能控件的坐标做一些逻辑操作时,居然不知道怎么做.所以在网上查找了资料后,解决了这个问题.这里记录 ...

  8. Android图表控件MPAndroidChart——曲线图LineChart的使用(财富收益图)

    目录 前言 本文涉及文章 其他相关文章 1.数据准备 1.1 数据来源 2.曲线展示 2.1 MPAndroidChart获取 2.2 数据对象获取 2.3 数据展示 3.曲线完善 3.1 图表背景. ...

  9. Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度

    Android AutoCompleteTextView 控件实现类似被搜索提示,效果如下 1.首先贴出布局代码 activity_main.xml: <?xml version="1 ...

最新文章

  1. mysql join order by_MySQL 14 慢查询优化join、order by、group by
  2. 对象分割--Fully Convolutional Instance-aware Semantic Segmentation
  3. ImportError: DLL load failed: 找不到指定的模块
  4. TensorFlow实现案例汇集:代码+笔记
  5. c语言将源文件拷贝到目的文件,C语言编译过程 简介和详解
  6. 架构师课程之-haproxy专业级负载均衡软件权威讲解
  7. matplotlib库绘图基础
  8. dev gridcontrol 单元格内容复制_Excel中的复制粘贴,不只是你想的那么简单的
  9. Spring学习总结四——SpringIOC容器四
  10. 深度学习含有递进关系的数据应该如何表达_文案写作:如何构建写作框架优化表达内容?...
  11. UBUNTU安装之后要配置的内容
  12. 平面几何----蝴蝶定理的证明
  13. html入住登记源码,酒店客户入住登记管理系统设计与实现.doc
  14. 数字电路加法器 基本原理(一)
  15. Linux系统安装教程(详细版)
  16. python程序员面试自我介绍_程序员面试要准备哪些方面的内容?
  17. 如何在不清空原有配置的情况下修改路由器密码??????
  18. python 基础代谢率计算_基于python实现计算且附带进度条代码实例
  19. c语言利用查表法画正弦波,嵌入式C语言查表法在项目中的应用
  20. 银行利息计算公式推导(存款,贷款)

热门文章

  1. Effective C++改善程序与设计的55个具体做法笔记
  2. --init--方法
  3. JavaME与Android的关系
  4. CSMA/CD和CSMA/CA的区别(最全知识点总结)
  5. Vscode设置python解释器
  6. CMMI认证唯一查询官网
  7. 【第七篇】Camunda系列-身份服务
  8. javafx 2 的表格 绑定到 map
  9. 北京络捷斯特第三方物流信息系统技术解析(二) 订单录入-入库订单
  10. MMpose 教程中文翻译-tutorial 0:学习配置文件