Android开发技巧之viewstub用法详解及实现延迟加载

 ViewStub 是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,避免资源浪费,在需要的时候才加载View

"

需要注意的是,加载view之后,viewstub本身就会被新加载进来的view替换掉

上代码了,看完就理解了

acitivity_main.xml

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <include  
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="wrap_content"  
  9.         android:layout_alignParentTop="true"  
  10.         android:layout_marginTop="30dp"  
  11.         layout="@layout/header" />  
  12.   
  13.     <ViewStub  
  14.         android:id="@+id/pic_stub"  
  15.         android:layout_width="wrap_content"  
  16.         android:layout_height="wrap_content"  
  17.         android:layout_centerInParent="true"  
  18.         android:inflatedId="@+id/pic_view_id_after_inflate"  
  19.         android:layout="@layout/pic_view" />  
  20.   
  21.   
  22.     <include layout="@layout/footer" />  
  23.   
  24. </RelativeLayout>  


其中inflatedId就是新加载进来的view的id,如果需要获取这个view,就要用这个inflatedId,原来的id已经被取代了

而layout就是要加载进来的布局,代码如下

pic_view.xml

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <ImageView  
  7.         android:id="@+id/iv_pic"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent"  
  10.         android:src="@drawable/pic" >  
  11.     </ImageView>  
  12.   
  13. </LinearLayout>  


里面只放了一张图片

 

MainActivity.java

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.     private ViewStub pic_sub;  
  3.   
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.activity_main);  
  8.         pic_sub = (ViewStub) findViewById(R.id.pic_stub);  
  9.         new Timer().schedule(new TimerTask() {  
  10.   
  11.             @Override  
  12.             public void run() {  
  13.                 handler.sendEmptyMessage(1);  
  14.             }  
  15.         }, 1000);// 延迟1秒,然后加载  
  16.     }  
  17.   
  18.     Handler handler = new Handler() {  
  19.         public void handleMessage(android.os.Message msg) {  
  20.             View pic_view = pic_sub.inflate();// ①  
  21.             //pic_sub.setVisibility(View.VISIBLE);// ②  
  22.             ImageView iv_pic = (ImageView) pic_view.findViewById(R.id.iv_pic);  
  23.             iv_pic.setImageResource(R.drawable.pic);  
  24.             View view = findViewById(R.id.pic_stub);//③  
  25.             view = findViewById(R.id.pic_view_id_after_inflate);//④  
  26.         };  
  27.     };  
  28. }  

 

①inflate()被调用时, 被加载的视图替代viewstub并且返回自己的视图对象。这使得应用程序不需要额外执行findViewById()来获取所加载的视图的引用

②句不需要,如果用到setvisibility的话,那么①②两句顺序不可颠倒,否则报错

java.lang.IllegalStateException:ViewStub must have a non-null ViewGroup viewParent,因为viewstub不能反复inflate,只能inflate一次,setVisibility会间接调用inflate


①句 获取到加载进来的pic_view,使得应用程序不需要额外执行findViewById()来获取加载视图的引用,如果要自己获取的话,id要用inflateid

③句  这里view将会是null,因为viewstub被替换掉,pic_stub的id已经不存在了

④句  用inflateid获取到加载进来的view正常

 

 

作者:jason0539

微博:http://weibo.com/2553717707

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值