在实际开发中,ViewStub 在提升用户体验和优化性能方面都是有一定作用的!
ViewStub就是一个宽高都为0的一个View,它默认是不可见的,只有通过调用setVisibility函数或者Inflate函数才会将其要装载的目标布局给加载出来。也就是页面默认是不加载ViewStub所指向的View的,而ViewStub本身是一个轻量级的View,占用资源非常小的控件。
这就为我们一开始加载页面的时候省出来了资源,从而提升性能!
还有在一些页面我们需要延时加载的内容,我们也可以使用ViewStub,比如我们电商平台的产品详情页面,它底部的相关产品推荐,这个我们刚进入产品详情页面完全可以先不加载它,等我们的详情页面加载出来了我们在使用ViewStub.inflate(),让其显示出来!这样就能提升我们一开始加载页面的速度和内存开支!
还有就是我们在一些页面是需要根据不同的情况显示和隐藏一些控件,比如还是我们的产品详情页面,有些产品是带有优惠券的,有些则是不带的,这个时候我们带有优惠券的就需要把优惠券显示出来!我们用ViewStub,页面开始是用不加载优惠券相应的控件的,当有优惠券时我们再去加载,这样也就节省了很多资源!
我们一个页面可能看不出来多大的差别,感觉现在手机内存也都大了,不在乎那么一点内存!可是开发中我们明确的知道我们手机上的每个APP分到的实际内存还是很有限的!我们要是每个页面都能少开支一些,我们的APP性能将提升很多!
而我们的ViewStub 其实很简单,也是希望大家能够熟悉它并使用它!
这里需要注意的是ViewStub只能Inflate一次,之后会被置空,所以之后ViewStub是没有办法控制它指向的layout的!
下面给大家看一个简单的例子:
主页面UI,两个ViewStub
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<ViewStub
android:id="@+id/viewstub_text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:layout_marginTop="10dip"
android:layout="@layout/text1_layout"/>
<ViewStub
android:id="@+id/viewstub_text2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:layout="@layout/text2_layout"/>
</LinearLayout>
text1_layout 的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:gravity="center"
android:text="吃饭"
android:textColor="@color/text_color"
android:textSize="16sp"/>
</LinearLayout>
text2_layout 的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/text2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:gravity="center"
android:text="睡觉"
android:textColor="@color/text_color"
android:textSize="16sp"/>
</LinearLayout>
Activity代码
public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String str = getIntent.getStringExtra("type");
if (str.equals("吃饭")) {
ViewStub stub = (ViewStub) findViewById(R.id.viewstub_text1);
stub.inflate();
} else {
ViewStub stub = (ViewStub) findViewById(R.id.viewstub_text2);
stub.inflate();
}
}
}