Android ViewStub控件
前言
使用ViewStub
可以实现界面的延迟加载。
1. ViewStub简单应用
布局文件,layout
为加载View
,inflatedId
为加载后View
的id
。
<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
, inflatedId
和layout
,并设置为不可见。
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控件相关推荐
- android listview viewstub,Android布局优化之ViewStub控件
ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...
- Android神奇“控件”-----RemoteViews
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请注明 http://blog.csdn.net/wrg_20100512/article/details/53940485 好 ...
- Android开源控件ViewPager Indicator的使用方法
1月16日厦门 OSC 源创会火热报名中,奖品多多哦 摘要 Android开源控件ViewPager Indicator的使用介绍 ViewPagerIndicator 目录[-] 1. V ...
- 日历控件的android代码,Android日历控件PickTime代码实例
Android日历控件PickTime代码实例 发布时间:2020-10-03 16:05:51 来源:脚本之家 阅读:86 作者:手撕高达的村长 最近做项目,需要设置用户的生日,所以做这样一个功能. ...
- android 获取控件高度_安卓开发入门教程UI控件_ImageView
什么是ImageView ImageView是用于显示图片的UI控件. 基础样例 1.展示本地图片 效果图 代码 <ImageViewandroid:layout_width="wra ...
- xamarin.android 控件,Android 库控件 - Xamarin | Microsoft Docs
Xamarin Android 库控件Xamarin.Android Gallery control 03/15/2018 本文内容 Gallery是一种布局小组件,用于显示水平滚动列表中的项,并将当 ...
- android 获取控件在屏幕中的坐标
今天,简单讲讲android如何获取控件在屏幕中的坐标. 这个其实也很简单,但是昨天做一个功能时,需要功能控件的坐标做一些逻辑操作时,居然不知道怎么做.所以在网上查找了资料后,解决了这个问题.这里记录 ...
- Android图表控件MPAndroidChart——曲线图LineChart的使用(财富收益图)
目录 前言 本文涉及文章 其他相关文章 1.数据准备 1.1 数据来源 2.曲线展示 2.1 MPAndroidChart获取 2.2 数据对象获取 2.3 数据展示 3.曲线完善 3.1 图表背景. ...
- Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度
Android AutoCompleteTextView 控件实现类似被搜索提示,效果如下 1.首先贴出布局代码 activity_main.xml: <?xml version="1 ...
最新文章
- mysql join order by_MySQL 14 慢查询优化join、order by、group by
- 对象分割--Fully Convolutional Instance-aware Semantic Segmentation
- ImportError: DLL load failed: 找不到指定的模块
- TensorFlow实现案例汇集:代码+笔记
- c语言将源文件拷贝到目的文件,C语言编译过程 简介和详解
- 架构师课程之-haproxy专业级负载均衡软件权威讲解
- matplotlib库绘图基础
- dev gridcontrol 单元格内容复制_Excel中的复制粘贴,不只是你想的那么简单的
- Spring学习总结四——SpringIOC容器四
- 深度学习含有递进关系的数据应该如何表达_文案写作:如何构建写作框架优化表达内容?...
- UBUNTU安装之后要配置的内容
- 平面几何----蝴蝶定理的证明
- html入住登记源码,酒店客户入住登记管理系统设计与实现.doc
- 数字电路加法器 基本原理(一)
- Linux系统安装教程(详细版)
- python程序员面试自我介绍_程序员面试要准备哪些方面的内容?
- 如何在不清空原有配置的情况下修改路由器密码??????
- python 基础代谢率计算_基于python实现计算且附带进度条代码实例
- c语言利用查表法画正弦波,嵌入式C语言查表法在项目中的应用
- 银行利息计算公式推导(存款,贷款)