在Android开发的工作学习中,我们往往会遇到一个比较复杂的页面,如一件商品的详情页,如天猫商城,一件商品的价格,图文介绍,秒杀活动,商品用户评价等,而且这些数据往往不是一个接口下发的,我们常规的处理是:
- 先将所有的view设为Gone,当后台接口调用成功后,在callback里面设置view的属性,并设为Visiable。
- 所有的接口异步并行调用。
这样的处理,也没有什么大问题,不过我们还可以做的更好,即使用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);
}
});
}
总结:
- ViewStub可以优化布局的显示,适用于需要延迟加载的布局。
- ViewStub被显示之后,不可以再次使用ViewStub对象来显影被ViewStub代替的布局,我在上面的textview点击事件中做了演示,大家自行测试。
- 当一个页面需要调用多个接口时,我认为使用异步串行调用,用户体验更好,一步步显示需要加载的数据。
今天就到这吧,第一次写文章,大家将就看吧,我会加油的。