首页 > 代码库 > Android 使用ViewStub优化布局

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. 当一个页面需要调用多个接口时,我认为使用异步串行调用,用户体验更好,一步步显示需要加载的数据。

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

Android 使用ViewStub优化布局