大家写项目的时候肯定会有一些东西提前写好,可是不到一定条件是不想让它显示出来的。我们可能的做法就是让它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. compositionstart 、 compositionend 、 input都存在时的解决办法

    $(function () { var cpLock = true; $('#textbox').off().on({ compositionstart: function () {//中文输入开始 ...

  2. Selenium菜鸟手册

    转自: http://www.iselenium.com/read.php?tid=458 首先声明我还是一只很菜的菜鸟,学习Selenium一个来月而已,发这个帖子是想利用我这块板砖引出真正的玉来, ...

  3. Cpython解释器支持的线程

    因为Python解释器帮你自动定期进行内存回收,你可以理解为python解释器里有一个独立的线程,每过一段时间它起wake up做一次全局轮询看看哪些内存数据是可以被清空的,此时你自己的程序 里的线程 ...

  4. UVALIVE 3307 Adventurous Driving

    一开始重新建图搞的.然后参照了别人的博客.这个解法比较好 利用在SPFA维护入队次数.入队次数大于节点数目的位于负环. 那么负环中的点如何DFS到终点.(SPFA从起点开始如果能找到入队大于N那么一定 ...

  5. twilio打电话和发短信

    # -*- coding: utf-8 -*- # @Time : 2018/03/09 14:53 # @Author : cxa # @File : call.py # @Software: Py ...

  6. maven自动建立目录骨架

    maven提供archetype插件,用于创建符合maven规定的目录骨架. 方式一: 命令行执行mvn archetype:generate,在回显中依次写入如下参数: 执行完成会自动的生成响应的标 ...

  7. float和double类型的存储方式

    Float double 类型在计算机的存储方式 计算机中只认识10的二进制数,那么该如何存储小数呢? 那么我们先看Floa类型: Float在计算机(32位)中是4个字节的,具体地:第一位为符号位0 ...

  8. Javascript传参参考

    可参考的细节: <!doctype html> <html lang="en"> <head> <meta charset="U ...

  9. kafka 分区数

    Kafka的分区,相当于把一个Topic再细分成了多个通道(对应 多个线程) 部署的时候尽量做到一个消费者(线程)对应一个分区. 如何确定Kafka的分区数,key和consumer线程数,以及不消费 ...

  10. 解决Unknown host 'd29vzk4ow07wi7.cloudfront.net'. You may need to adjust the proxy settings in Gradle.

    有时候打开AndroidStudio项目,没问题啊,昨天还打开没事的,今天打不开了或者你同步了一下项目,报错了.很无辜有没有.有时候多开机几次,多关几次AS,又莫名好了. 尝试过很多方法无效,这个文章 ...