ViewStub的实战开发

简介:

一.常见的布局分析

     在开发的时候,有些布局是要根据条件而动态显示,达到一个布局两用的效果,运用View.VISIBLE和View.GONE去改变布局的可见性,

这样的做法显然是没什么多大的问题,优点逻辑清晰,控制灵活,但缺点就是耗费资源,在setContentView()或者用inflate加载布局文件时
,无论View是否被设置为View.GONE(隐藏)和View.VISIBLE(可见),都会创建对象,占用一点程度上的内存,所以在考虑优化程序的时候,

尽量避免资源浪费,降低程序的资源占有量,提高响应速度,提升软件的用户体验。

 

二.ViewStub的介绍

    1.其实Google在android1.0发布的时候,就提供了android.view.ViewStub类,继承于android.view.View,
是一个轻量级的View,不占用布局的位置(相对于View设置了View.GONE效果),占用资源小,性能尤佳等特点;

   2.使用ViewStub两个属性:
     1)android:inflatedId :重新定义引用布局文件根元素Id,运用inflateId要注意两点:
         a.可以不用设置;
         b.在ViewStub设置inflatedId,无论引用布局文件的根元素Id是否设置,都将被inflateId所代替,
         那么布局文件本身的Id会重置,即没有了,如果被实例化使用,将会报空指针异常:
         java.lang.NullPointerException;

    2)android:layout:引用布局文件,需独立的layout文件,类似include的layout属性,这个属性必须要设置否则报错:
        java.lang.IllegalArgumentException: ViewStub must have a valid layoutResource
 
   3.ViewStub的使用
     ViewStub有个特点,它只能被inflate一次,之后会被置空,如果再次使用inflate时,则会报空指针异常,
     所以ViewStub也不是万能的,如果是经常要来回切换ViewStub的显示和隐藏,ViewStub就不适用,但有个办法
     可以控制引用布局里的View的可见性,在一定程度上,可以控制可见性;

 

三.开发实战

 1.MainActivity.java

复制代码
 1 /**
 2  * @ClassName MainActivity  
 3  * @Description TODO  布局文件有两个ViewStub,在程序onCreate时,用奇偶来决定显示那一个ViewStub
 4  *                     布局-------1 和 布局-------2
 5  * @author kenny  
 6  * @date 2012-8-18
 7  */
 8 public class MainActivity extends Activity {
 9 
10     @Override
11     public void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.activity_main);
14 
15         ViewStub viewStub;
16         if (((int) (Math.random() * 100)) % 2 == 0) {
17             viewStub = (ViewStub) findViewById(R.id.viewstub_demo_text);
18             viewStub.setVisibility(View.VISIBLE);
19             
20             /** 用inflate()和setVisibility()效果一样 */
21             //viewStub.inflate();
22         } else {
23             viewStub = (ViewStub) findViewById(R.id.viewstub_demo_image);
24             viewStub.setVisibility(View.VISIBLE);
25         }
26     }
27 }
复制代码

 

 2.activity_main.xml

复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:gravity="center_horizontal"
 6     android:orientation="vertical" >
 7 
 8     <ViewStub
 9         android:id="@+id/viewstub_demo_text"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:layout_marginLeft="5dip"
13         android:layout_marginRight="5dip"
14         android:layout_marginTop="10dip"
15         android:layout="@layout/viewstub_demo_textview01" />
16 
17     <ViewStub
18         android:id="@+id/viewstub_demo_image"
19         android:layout_width="wrap_content"
20         android:layout_height="wrap_content"
21         android:layout_marginLeft="5dip"
22         android:layout_marginRight="5dip"
23         android:layout="@layout/viewstub_demo_textview02" />
24 </LinearLayout>
复制代码

 

 3.viewstub_demo_textview01.xml

复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="wrap_content"
 4     android:layout_height="wrap_content"
 5     android:orientation="vertical" >
 6 
 7     <TextView
 8         android:id="@+id/textview01"
 9         android:layout_width="fill_parent"
10         android:layout_height="wrap_content"
11         android:background="#aa664411"
12         android:textSize="16sp"
13         android:text="布局-------1"
14          />
15 
16 </LinearLayout>
复制代码

 

 4.viewstub_demo_textview02.xml

复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="wrap_content"
 4     android:layout_height="wrap_content"
 5     android:orientation="vertical" >
 6 
 7     <TextView
 8         android:id="@+id/textview02"
 9         android:layout_width="fill_parent"
10         android:layout_height="wrap_content"
11         android:background="#aa664411"
12         android:textSize="16sp"
13         android:text="布局-------2"
14          />
15 
16 </LinearLayout>
复制代码

源码下载:/Files/hpboy/ViewStub01.zip

 

转载请注明出处:http://www.cnblogs.com/hpboy

相关文章
|
数据安全/隐私保护
【VBScript】vbs 错误未结束的错误字符串常量
【VBScript】vbs 错误未结束的错误字符串常量
241 0
|
C语言 索引
【数据结构】C语言实现栈(详细解读)(下)
【数据结构】C语言实现栈(详细解读)(下)
146 0
|
机器学习/深度学习 开发框架 .NET
YOLOv5的Tricks | 【Trick6】学习率调整策略(One Cycle Policy、余弦退火等)
YOLOv5的Tricks | 【Trick6】学习率调整策略(One Cycle Policy、余弦退火等)
3924 0
YOLOv5的Tricks | 【Trick6】学习率调整策略(One Cycle Policy、余弦退火等)
|
2月前
|
前端开发 JavaScript Linux
用 Go 写桌面应用?试试 Wails 吧!
Wails 是一个结合 Go 语言与前端技术(如 Vue、React)开发轻量级桌面应用的框架。相比 Electron,它更轻、更快,资源占用更低,支持跨平台打包,适合熟悉 Web 开发又追求原生性能的开发者。
468 0
|
Docker 容器
Docker入门(8)-- Docker 将容器打包成镜像以及导入导出
Docker 将容器打包成镜像以及导入导出
9133 0
|
机器学习/深度学习
神经网络可能不再需要激活函数?Layer Normalization也具有非线性表达!
【7月更文挑战第14天】研究表明,层归一化(LayerNorm)可能具备非线性表达能力,挑战了神经网络对激活函数的依赖。在LN-Net结构中,仅使用线性层与LayerNorm就能实现复杂分类,其VC维度下界证明了非线性表达。尽管如此,是否能完全替代激活函数及如何有效利用这一特性仍需更多研究。[arXiv:2406.01255]
194 5
|
7月前
|
前端开发 API
el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能,利用@sort-change实现动态数据排序,el-table排序方法,el-table可变数据的动态排序
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
数据采集 数据可视化 数据挖掘
数据挖掘实战:使用Python进行数据分析与可视化
在大数据时代,Python因其强大库支持和易学性成为数据挖掘的首选语言。本文通过一个电商销售数据案例,演示如何使用Python进行数据预处理(如处理缺失值)、分析(如销售额时间趋势)和可视化(如商品类别销售条形图),揭示数据背后的模式。安装`pandas`, `numpy`, `matplotlib`, `seaborn`后,可以按照提供的代码步骤,从读取CSV到数据探索,体验Python在数据分析中的威力。这只是数据科学的入门,更多高级技术等待发掘。【6月更文挑战第14天】
1265 11
|
Linux 调度
Linux内核的基础设施:工作队列、等待队列
本文介绍了Linux内核中的工作队列和等待队列机制,通过一个具体的Demo演示了如何使用等待队列进行条件等待和唤醒,以及工作队列的创建和调度,同时展示了修改唤醒条件导致无法唤醒进程的情况。
343 0
|
Ubuntu 机器人 虚拟化
Ubuntu22.04配置ROS2 Humble
这篇文章是关于如何在Ubuntu 22.04系统上配置ROS2 Humble的详细教程,包括虚拟机安装、环境配置、网络设置、软件源更换、ROS1和ROS2的安装步骤。
3119 1