Android 使用ViewStub优化布局

  在Android开发的工作学习中,我们往往会遇到一个比较复杂的页面,如一件商品的详情页,如天猫商城,一件商品的价格,图文介绍,秒杀活动,商品用户评价等,而且这些数据往往不是一个接口下发的,我们常规的处理是:

  1. 先将所有的view设为Gone,当后台接口调用成功后,在callback里面设置view的属性,并设为Visiable。
  2. 所有的接口异步并行调用。

  这样的处理,也没有什么大问题,不过我们还可以做的更好,即使用ViewStub。

  通俗的说,ViewStub是一个轻量级的view,可以使用它代替一个layout布局,当activity的根布局被infalter的时候,被ViewStub代替的子布局不会被解析,直到我们设置ViewStub为visiable 或者 调用ViewStub 的inflate()方法。

  这是主布局的xml代码。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.firstapp.MainActivity"
    android:orientation="vertical"
    tools:ignore="MergeRootFrame" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />
    
    
    <ViewStub 
        android:id="@+id/viewstub"
        android:layout="@layout/view_stub_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
    
</LinearLayout>

这是被ViewStub代替的布局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"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <ProgressBar
        android:id="@+id/progressBar1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <SeekBar
        android:id="@+id/seekBar1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <RatingBar
        android:id="@+id/ratingBar1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <RadioButton
            android:id="@+id/radio0"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="RadioButton" />

        <RadioButton
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="RadioButton" />

        <RadioButton
            android:id="@+id/radio2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="RadioButton" />
    </RadioGroup>


</LinearLayout>

  下面是activity里面的实例代码,很简单,不多赘言。

	ViewStub mViewStub;
	TextView mTextView;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mViewStub = (ViewStub) this.findViewById(R.id.viewstub);
        mViewStub.setVisibility(View.VISIBLE);
        
        mTextView = (TextView) this.findViewById(R.id.textView1);
        mTextView.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				mViewStub.setVisibility(mViewStub.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE);
			}
		});
        
        
    }

   总结:

  1. ViewStub可以优化布局的显示,适用于需要延迟加载的布局。
  2. ViewStub被显示之后,不可以再次使用ViewStub对象来显影被ViewStub代替的布局,我在上面的textview点击事件中做了演示,大家自行测试。
  3. 当一个页面需要调用多个接口时,我认为使用异步串行调用,用户体验更好,一步步显示需要加载的数据。

     今天就到这吧,第一次写文章,大家将就看吧,我会加油的。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。