首页 > 代码库 > Android开发技巧之viewstub用法详解及实现延迟加载

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

这一篇是接着上面的include标签的例子来讲的,地址http://blog.csdn.net/jason0539/article/details/26131831

 

上一篇的布局中间就用了viewstub这个控件,现在来说一下其作用和用法

"

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

"

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

上代码了,看完就理解了

acitivity_main.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" >    <include        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_alignParentTop="true"        android:layout_marginTop="30dp"        layout="@layout/header" />    <ViewStub        android:id="@+id/pic_stub"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:inflatedId="@+id/pic_view_id_after_inflate"        android:layout="@layout/pic_view" />    <include layout="@layout/footer" /></RelativeLayout>


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

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

pic_view.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" >    <ImageView        android:id="@+id/iv_pic"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:src=http://www.mamicode.com/"@drawable/pic" >>


里面只放了一张图片

 

MainActivity.java

public class MainActivity extends Activity {	private ViewStub pic_sub;	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		pic_sub = (ViewStub) findViewById(R.id.pic_stub);		new Timer().schedule(new TimerTask() {			@Override			public void run() {				handler.sendEmptyMessage(1);			}		}, 1000);// 延迟1秒,然后加载	}	Handler handler = new Handler() {		public void handleMessage(android.os.Message msg) {			View pic_view = pic_sub.inflate();// ①			//pic_sub.setVisibility(View.VISIBLE);// ②			ImageView iv_pic = (ImageView) pic_view.findViewById(R.id.iv_pic);			iv_pic.setImageResource(R.drawable.pic);			View view = findViewById(R.id.pic_stub);//③			view = findViewById(R.id.pic_view_id_after_inflate);//④		};	};}

 

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

博客:http://blog.csdn.net/jason0539(转载请说明出处)