当前位置:  编程技术>移动开发

Android笔记之:深入ViewStub的应用

    来源: 互联网  发布时间:2014-10-16

    本文导语:  在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局。那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的...

在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局。那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。但是它的缺点就是,耗费资源。虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被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的可见性来控制。
下面来看一个实例
在这个例子中,要显示二种不同的布局,一个是用TextView显示一段文字,另一个则是用ImageView显示一个图片。这二个是在onCreate()时决定是显示哪一个,这里就是应用ViewStub的最佳地点。
先来看看布局,一个是主布局,里面只定义二个ViewStub,一个用来控制TextView一个用来控制ImageView,另外就是一个是为显示文字的做的TextView布局,一个是为ImageView而做的布局:
代码如下:



 
 


为TextView的布局:
代码如下:



   


为ImageView的布局:
代码如下:



   


下面来看代码,决定来显示哪一个,只需要找到相应的ViewStub然后调用其infalte()就可以获得相应想要的布局:
代码如下:

package com.effective;
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewStub;
import android.widget.ImageView;
import android.widget.TextView;
public class ViewStubDemoActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewstub_demo_activity);
        if ((((int) (Math.random() * 100)) & 0x01) == 0) {
            // to show text
            // all you have to do is inflate the ViewStub for textview
            ViewStub stub = (ViewStub) findViewById(R.id.viewstub_demo_text);
            stub.inflate();
            TextView text = (TextView) findViewById(R.id.viewstub_demo_textview);
            text.setText("The tree of liberty must be refreshed from time to time" +
                    " with the blood of patroits and tyrants! Freedom is nothing but " +
                    "a chance to be better!");
        } else {
            // to show image
            // all you have to do is inflate the ViewStub for imageview
            ViewStub stub = (ViewStub) findViewById(R.id.viewstub_demo_image);
            stub.inflate();
            ImageView image = (ImageView) findViewById(R.id.viewstub_demo_imageview);
            image.setImageResource(R.drawable.happy_running_dog);
        }
    }
}

运行结果:



使用的时候的注意事项:
1. 某些布局属性要加在ViewStub而不是实际的布局上面,才会起作用,比如上面用的android:layout_margin*系列属性,如果加在TextView上面,则不会起作用,需要放在它的ViewStub上面才会起作用。而ViewStub的属性在inflate()后会都传给相应的布局。


    
 
 

您可能感兴趣的文章:

  • Android开发技巧之ViewStub控件惰性装载
  • 深入分析Android ViewStub的应用详解
  • 深入android Unable to resolve target 'android-XX'详解
  • 深入Android开发FAQ的详解
  • Android 自动化测试经验分享 深入UiScrollable
  • 基于android中读取assets目录下a.txt文件并进行解析的深入分析
  • Android中asset文件夹与raw文件夹的区别深入解析
  • Android开发之文件操作模式深入理解
  • Android Mms之:深入理解对话列表管理
  • android生命周期深入分析(一)
  • Android 关机弹出选择菜单的深入解析
  • 深入Android SQLite 事务处理详解
  • ubuntu 12.10 上 android 编译环境搭建的深入解析
  • 深入Android Browser配置管理的详解
  • 深入Android MediaPlayer的使用方法详解
  • Android中使用PULL方式解析XML文件深入介绍
  • 深入android中The connection to adb is down的问题以及解决方法
  • Android笔记之:深入为从右向左语言定义复杂字串的详解
  • Android开发笔记之:深入理解Cursor相关的性能问题
  • 深入Understanding Android ContentProvider详解
  • android的编译和运行过程深入分析
  • Android自定义属性 format的深入解析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Android开发笔记之:返回键的复写onBackPressed()介绍
  • Android开发笔记之:如何安全中止一个自定义线程Thread的方法
  • Android Mouse实现过程详细笔记
  • Android开发笔记之:复写按钮方法
  • Android学习笔记(一)环境安装及第一个hello world
  • Android开发笔记之:一分钟学会使用Logcat调试程序的详解
  • Android笔记之:onConfigurationChanged详解
  • Android开发笔记之:如何屏蔽Button setClickable与setEnabled
  • Android开发之文件操作模式深入理解 iis7站长之家
  • Android学习笔记--通过Application传递数据代码示例
  • Android学习笔记(二)App工程文件分析
  • Android开发笔记之:在ImageView上绘制圆环的实现方法
  • Android笔记之:App模块化及工程扩展的应用
  • Android开发笔记之:Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
  • Android学习笔记之Shared Preference
  • Android开发笔记之:对实践TDD的一些建议说明
  • Android学习笔记--使用剪切板在Activity中传值示例代码
  • Android笔记之:App调试的几个命令的实践与分析
  • Android学习笔记--Activity中使用Intent传值示例代码
  • Android开发笔记之:Splash的实现详解
  • 申请Android Map 的API Key(v2)的最新申请方式(SHA1密钥)
  • Android瀑布流实例 android_waterfall
  • Android开发需要的几点注意事项总结
  • Android系统自带样式 (android:theme)
  • android 4.0 托管进程介绍及优先级和回收机制
  • Android网络共享软件 Android Wifi Tether
  • Android访问与手机通讯相关类的介绍
  • Android 图标库 Android GraphView
  • Android及andriod无线网络Wifi开发的几点注意事项
  • 轻量级Android开发工具 Android Tools
  • Android 2.3 下StrictMode介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3