大家写项目的时候肯定会有一些东西提前写好,可是不到一定条件是不想让它显示出来的。我们可能的做法就是让它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的使用方法的更多相关文章

  1. 【Android】一种提高Android应用进程存活率新方法

    [Android]一种提高Android应用进程存活率新方法 SkySeraph Jun. 19st 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph ...

  2. Android经典完美退出方法

    Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activit ...

  3. Android获取系统时间方法的总结

    Android获取系统时间方法的方法有很多种,常用的有Calendar.Date.currentTimeMills等方法. (1)Calendar Calendar获取系统时间首先要用Calendar ...

  4. 删除Android自带软件方法及adb remount 失败解决方案

    删除Android自带软件方法 1.在电脑上打开cmd,然后输入命令 adb remount adb shell su 2.接着就是Linux命令行模式了,输入 cd system/app 3然后输入 ...

  5. PhoneGap 在 Android 上的插件开发方法介绍

    移动应用开发已经成为软件开发的一个重要方向,但是移动开发面临的一个重要问题就是跨平台的问题.PhoneGap 作为一个多平台的软件开发框架,提供了一次编写多个平台的运行.目前已经支持多达 6 个移动平 ...

  6. Android之完美退出方法

    为什么要写这篇文章? 网上有很多种退出方法,可实际上很多方法都不通用(在某个版本下可用,到了另一个版本就不行),或者方法的实际效果根本就和其描述不符(也不知道那些发帖的人测没测试过). 但我们的需求又 ...

  7. (转)Android之常用功能方法大集合

    这些,都是Andorid中比较常用的方法和功能,在网上搜集整理一下记录之,以备不时之需.由于经过多次转载,源文作者不确凿,在此申明,敬请见谅.不得不赞,非常实用. 1.判断sd卡是否存在 boolea ...

  8. android view的setVisibility方法值的意思

    android view的setVisibility方法值的意思 有三个值 visibility  One of VISIBLE, INVISIBLE, or GONE. 常量值为0,意思是可见的 常 ...

  9. Eclipse导入Android项目的正确方法

    转自Eclipse导入Android项目的正确方法 看网上流传的Eclipse导入项目的方法都是在新建Android程序时使用"Create project form existing so ...

随机推荐

  1. bzoj 3196二逼平衡树 线段树套平衡树

    比较裸的树套树,对于区间K值bz上有一道裸题,详见题解http://www.cnblogs.com/BLADEVIL/p/3455336.html(其实题解也不是很详细) //By BLADEVIL ...

  2. bzoj1053 搜索

    2013-11-16 17:43 原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1053 因为使pi(prime[i])<20亿的i不 ...

  3. ARM-Linux (临时,正式) 建立页表的比较【转】

    转自:http://blog.csdn.net/edwardlulinux/article/details/38967521 版权声明:本文为博主原创文章,未经博主允许不得转载.   很久没有写博客了 ...

  4. python Nosql-redis 连接、管道

    非关系型数据库和关系型数据库的差别: 非关系型数据库的优势: 性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高. 可扩展性同样也是因为基于 ...

  5. Selenium2+python自动化52-unittest执行顺序【转载】

    前言 很多初学者在使用unittest框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行. 本篇通过最简单案例详细讲解unittest执行顺 ...

  6. KVM(七)使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照

    本文将梳理 QEMU/KVM 快照相关的知识,以及在 OpenStack Nova 中使用 libvirt 来对 QEMU/KVM 虚机做快照的过程. 1. QEMU/KVM 快照 1.1 概念 QE ...

  7. LayerDate渲染多个class出现闪现问题的解决

    填写表单的时候有时候会需要添加一行表单的业务逻辑,而表单要用到LayerDate的话便不可避免的出现多个class的情况 这种情况下后面的class是无法渲染的,layerDate官网提出了解决方法: ...

  8. AC日记——Success Rate codeforces 807c

    Success Rate 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> ...

  9. (十六)MySQL集群galera实现

    (1)环境介绍 galera官网:http://galeracluster.com/downloads/ # cat /etc/redhat-release CentOS Linux release ...

  10. 实现用http上传文件,用ftp下载文件

    1.ftp配置 1.检查安装vsftpd软件 使用如下命令#rpm -qa |grep vsftpd可以检测出是否安装了vsftpd软件, 如果没有安装,使用YUM命令进行安装. 2.启动服务 使用v ...