Android中关于布局文件延迟加载控件ViewStub

1 
         在Android中可以很容易使用<include />标签复用布局,可是当使用<include />标签引入了一些复杂控件时,有些控件在实际的使用过程中,很少会使用它,这样以来会降低页面加载的速度。针对这样的情况,可以使用Android 提供<ViewStub />标签进行优化。

        <ViewStub />标签是一个轻量级的View,它不会占据任何空间,也不参与布局的计算与绘制,只是在控件树中做一个最简单的占位符,只有在确实需要使用<ViewStub />标签引用的布局时,才会去加载布局。把这种行为称之为延迟加载最贴切不过了。在第四章中,讲解ListView绑定EmptyView的时候我们曾经使用过ViewStub,也做过简单介绍。

        在使用ViewStub时,通常需要给它设置以下三个属性:

        1、android:id  与其他控件一样,ViewStub也有id属性,根据它可以查找到ViewStub
        2、android:layout 指向ViewStub引用的布局,与include标签的laytout属性类似
        3、android:inflateId通过它能覆盖引用的布局文件根节点的id,与include标签的id属性类似。

        下面的xml代码显示了ViewStub的使用方法:
 

view source print?

1    <ViewStub 
2        android:id="@+id/viewstub_progress"
3        android:inflatedId="@+id/layout_progress_inflated"
4        android:layout="@layout/layout_progressbar"
5        android:layout_width="fill_parent"
6        android:layout_height="wrap_content"
7        android:layout_gravity="bottom"
8        />


        在需要加载ViewStub引用的布局时,只需要调用它的inflate()方法即可,也可以通过改变它的visibility属性让ViewStub自动加载布局文件。

        使用ViewStub的inflate()方法加载布局文件时,能够返回布局的根节点,如果需要操作布局的根节点,最好使用inflate()方法加载布局文件。

        Java代码如下:
 

view source print?

1        ((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
2        // 或者
3        View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();


        以下是本章Demo中ViewStub的使用方式:
 

view source print?

1progressView = ((ViewStub)findViewById(R.id.viewstub_progress)).inflate();
2  
3progressView.setVisibility(View.VISIBLE);
4progressView.setVisibility(View.GONE);


        下面通过本章的Demo对ViewStub进行练习,Demo中是一个简单的搜索界面,当点击搜索按钮后,布局中下方的ViewStub就会显示并显示进度条的提示,不进行搜索或者搜索完毕则不显示ViewStub。

        JAVA代码如下:
 

view source print?

001package com.devdiv.test.layout_test;
002  
003import android.app.Activity;
004import android.os.Bundle;
005import android.os.Handler;
006import android.view.View;
007import android.view.View.OnClickListener;
008import android.view.ViewStub;
009import android.view.animation.Animation;
010import android.view.animation.AnimationUtils;
011import android.widget.Button;
012import android.widget.ProgressBar;
013  
014  
015public class ViewStub_ExampleActivity extendsActivity {
016        privateButton searchButton;
017        privateButton cancelButton;
018        privateView progressView;
019        privateProgressBar mProgressBar;
020        privatestaticint count = 0;
021          
022        privateHandler mHandler =newHandler();
023        privateRunnable mRunnable =newRunnable() {
024                  
025                @Override
026                publicvoidrun() {
027                        // TODO Auto-generated method stub
028                        if(count >10) {
029                                searchCancel();
030                        }else{
031                                mProgressBar.setProgress(10* count++);
032                                mHandler.postDelayed(mRunnable,500);
033                        }
034                          
035                }
036        };
037          
038        @Override
039        protectedvoidonCreate(Bundle savedInstanceState) {
040                // TODO Auto-generated method stub
041                super.onCreate(savedInstanceState);
042                setContentView(R.layout.layout_viewstub);
043                  
044                searchButton = (Button) findViewById(R.id.button_search);
045                searchButton.setOnClickListener(newOnClickListener() {
046                          
047                        @Override
048                        publicvoidonClick(View v) {
049                                // TODO Auto-generated method stub
050                                searchStart();        
051                        }
052                });
053        }
054          
055        privatevoidsearchStart() {
056                if(progressView ==null) {
057                        //这句话要注意!!
058                        //加载布局!!
059                        progressView = ((ViewStub)findViewById(R.id.viewstub_progress)).inflate();
060                        mProgressBar = (ProgressBar) progressView.findViewById(R.id.progressbar);
061                        cancelButton = (Button) progressView.findViewById(R.id.button_cancel);
062                          
063                        cancelButton.setOnClickListener(newOnClickListener() {
064                                  
065                                @Override
066                                publicvoidonClick(View v) {
067                                        // TODO Auto-generated method stub
068                                        searchCancel();
069                                }
070                        });
071                          
072                }
073                  
074                showViewStub();
075                mHandler.post(mRunnable);
076        }
077          
078        privatevoidsearchCancel() {
079                if(progressView ==null) {
080                        progressView = findViewById(R.id.viewstub_progress);
081                }
082                mHandler.removeCallbacks(mRunnable);
083                hideViewStub();
084        }
085          
086        privatevoidshowViewStub() {
087                count =0;
088                mProgressBar.setProgress(0);
089                mProgressBar.setIndeterminate(false);
090                progressView.startAnimation(AnimationUtils.loadAnimation(this, R.anim.slide_in ));
091                progressView.setVisibility(View.VISIBLE);
092        }
093          
094        privatevoidhideViewStub() {
095                Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide_out);
096                progressView.startAnimation(anim);
097                progressView.setVisibility(View.GONE);
098                  
099                mProgressBar.setProgress(0);
100                mProgressBar.setIndeterminate(true);
101                  
102        }
103  
104}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值