zoukankan      html  css  js  c++  java
  • 【Android开发:UI优化系列一】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

  • 相关阅读:
    二、Python基础练习
    代码测试服同步到生产服务器
    支付宝网站支付 异步验签成功 同步验签失败
    最近机房让整改的漏洞 设置cookie httponly X-Frame-Options头未设置
    连连支付,或微信或支付宝支付,商品名称最后一个字乱码,php解决
    ci 框架新手使用
    php制作公司五章,圆形印章和椭圆形印章,正方形印章,圆角正方形印章,圆角框
    Libreoffice php使用命令行office转pdf,pdf转图片
    后台返回数据回显,使用js控制默认选中复选框和下拉框
    Nginx日志按日期切割详解(按天切割)
  • 原文地址:https://www.cnblogs.com/hpboy/p/2645400.html
Copyright © 2011-2022 走看看