Android ViewStub的使用方法
大家写项目的时候肯定会有一些东西提前写好,可是不到一定条件是不想让它显示出来的。我们可能的做法就是让它View.GONE
或View.INVISIBLE等到一定条件了在代码里面这设置View.VISIBLE
尽管这样写起来也挺方便的,也符合逻辑,可是这个条件是八百年都不出一次,你这么写就有点大才小用了,由于你事先布局好的Inflate,也就是说也就是说仍然会创建对象,会被实例化。会被设置属性。也就是说,会耗费内存等资源。
推荐的做法是使用android.view.ViewStub,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源很小的控件。能够为ViewStub指定一个布局,在Inflate布局的时候,仅仅有ViewStub会被初始化。然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候。ViewStub所向的布局就会被Inflate和实例化,然后ViewStub的布局属性都会传给它所指向的布局。这样。就能够使用ViewStub来方便的在执行时,要还是不要显示某个布局。
但ViewStub也不是万能的,以下总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。
首先来说说ViewStub的一些特点:
1. ViewStub仅仅能Inflate一次。之后ViewStub对象会被置为空。按句话说。某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。
2. ViewStub仅仅能用来Inflate一个布局文件。而不是某个详细的View,当然也能够把View写在某个布局文件里。
基于以上的特点。那么能够考虑使用ViewStub的情况有:
1. 在程序的执行期间。某个布局在Inflate后,就不会有变化,除非又一次启动。
由于ViewStub仅仅能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当须要在执行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。
这时就仅仅能使用View的可见性来控制了。
2. 想要控制显示与隐藏的是一个布局文件。而非某个View。
由于设置给ViewStub的仅仅能是某个布局文件的Id。所以无法让它来控制某个View。
所以。假设想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在执行时不断的显示与隐藏某个布局或View,仅仅能使用View的可见性来控制。
以下就说一个样例,这个样例是这种,我们先用ViewStub把xml布好,这显然不会被Inflate,我们在代码让他显示出来,可是突然条件有不符合了,我必须把显示的东西还得把它隐藏掉,可是这个时候ViewStub已经被销毁了。已经不能再用了。这个时候我们还得用GONE和VISIBLE来控制显示和隐藏。
首先我们定于三个XML:
主xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <ViewStub
android:id="@+id/viewstub1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:layout_marginTop="10dip"
android:layout="@layout/layout1"/>
<ViewStub
android:id="@+id/viewstub2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:layout_marginTop="10dip"
android:layout="@layout/layout2" /> <Button
android:id="@+id/btn_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="点击我显示隐藏的布局" /> </RelativeLayout>
剩下就是须要载入的XML
<? xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是被隐藏起来的布局" /> </LinearLayout>
<? xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" /> </LinearLayout>
我们看主代码:
package com.example.viewstub; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewStub;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends Activity {
private ViewStub viewStub1;
private ViewStub viewStub2;
private Button btnShow;
private boolean b=true;
private boolean a=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView(); }
private void initView(){
viewStub1=(ViewStub) findViewById(R.id.viewstub1);
viewStub2=(ViewStub) findViewById(R.id.viewstub2);
btnShow=(Button) findViewById(R.id.btn_show);
btnShow.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
if(b){//条件符合 显示布局
viewStub1.inflate();
viewStub2.inflate();
b=false;
}else{
if(a){//条件不符合 这个viewStub已经回收了所以我们仅仅能用GONE和VISIBLE
viewStub2.setVisibility(View.GONE);
viewStub1.setVisibility(View.GONE);
a=false;
}else{//条件符合
viewStub2.setVisibility(View.VISIBLE);
viewStub1.setVisibility(View.VISIBLE);
a=true;
} } }
}); } }
这样比較试用八百年都出现的条件符合。
代码太简单。不贴效果了!
Android ViewStub的使用方法的更多相关文章
- 【Android】一种提高Android应用进程存活率新方法
[Android]一种提高Android应用进程存活率新方法 SkySeraph Jun. 19st 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph ...
- Android经典完美退出方法
Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activit ...
- Android获取系统时间方法的总结
Android获取系统时间方法的方法有很多种,常用的有Calendar.Date.currentTimeMills等方法. (1)Calendar Calendar获取系统时间首先要用Calendar ...
- 删除Android自带软件方法及adb remount 失败解决方案
删除Android自带软件方法 1.在电脑上打开cmd,然后输入命令 adb remount adb shell su 2.接着就是Linux命令行模式了,输入 cd system/app 3然后输入 ...
- PhoneGap 在 Android 上的插件开发方法介绍
移动应用开发已经成为软件开发的一个重要方向,但是移动开发面临的一个重要问题就是跨平台的问题.PhoneGap 作为一个多平台的软件开发框架,提供了一次编写多个平台的运行.目前已经支持多达 6 个移动平 ...
- Android之完美退出方法
为什么要写这篇文章? 网上有很多种退出方法,可实际上很多方法都不通用(在某个版本下可用,到了另一个版本就不行),或者方法的实际效果根本就和其描述不符(也不知道那些发帖的人测没测试过). 但我们的需求又 ...
- (转)Android之常用功能方法大集合
这些,都是Andorid中比较常用的方法和功能,在网上搜集整理一下记录之,以备不时之需.由于经过多次转载,源文作者不确凿,在此申明,敬请见谅.不得不赞,非常实用. 1.判断sd卡是否存在 boolea ...
- android view的setVisibility方法值的意思
android view的setVisibility方法值的意思 有三个值 visibility One of VISIBLE, INVISIBLE, or GONE. 常量值为0,意思是可见的 常 ...
- Eclipse导入Android项目的正确方法
转自Eclipse导入Android项目的正确方法 看网上流传的Eclipse导入项目的方法都是在新建Android程序时使用"Create project form existing so ...
随机推荐
- (转)Git冲突:commit your changes or stash them before you can merge. 解决办法
用git pull来更新代码的时候,遇到了下面的问题: error: Your local changes to the following files would be overwritten by ...
- React 踩坑记录
1.React-router error: super expression must either be null or a function 原因:引入babel后写ES6风格的代码: class ...
- js反混淆工具
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...
- maven自动建立目录骨架
maven提供archetype插件,用于创建符合maven规定的目录骨架. 方式一: 命令行执行mvn archetype:generate,在回显中依次写入如下参数: 执行完成会自动的生成响应的标 ...
- oracle 一行转多行
比如sql: select zyxdm from table where bindid=2265254 查询结果为:1|4|8|9|10 将这个查询结果转成多行,结果如下: ID 1 4 8 9 10 ...
- jQuery中操作事件
JavaScript中操作事件的方式是这样的: 元素.on事件名=function(){ //事件执行的代码 } 但是jQuery有点不同,他的格式是这样的: 元素.on("事件名" ...
- Webpack指南(一):安装,创建项目,配置文件,开发环境以及问题汇总
Webpack是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency gra ...
- QPS、TPS、PV等网站业务关键字释义
QPS:Query Per Second TPS:Transaction Per Second PV:Page View RT:Response Time UV:Unique Visitor DAU: ...
- (一)Centos7安装zabbix3.4 server端
(1)环境准备 关闭firewalld和selinux systemctl stop firewalld systemctl disable firewalld #sed -ri '/^SELINUX ...
- (转帖)关于easyui中的datagrid在加载数据时候报错:无法获取属性"Length"的值,对象为null或未定义
结贴说明: 很感谢sp1234等人的热心帮忙和提醒,现在我主要说明下问题所在: 首先我在独立的js文件中,直接把测试数据loaddata进去datagrid是没有问题的.var kk = {" ...