ViewStub--Android懒加载
原创
©著作权归作者所有:来自51CTO博客作者wx5ba8dc11102bc的原创作品,请联系作者获取转载授权,否则将追究法律责任
定义
- ViewStub时一个不可见的View,通过延迟加载的方式优化布局提升渲染性能,满足了我们应用在特定的条件下,ViewStub的布局才需要被加载的情况
- 初次加载布局的时候也会占据内存,但是他所占的内存十分小(仅仅作为占位符使用)
- 意义:在某些时候我们需要根据情况动态的加载某些布局,但是又不想耗费资源的时候,ViewStub就会派上用场
ViewStub使用
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ViewStubTest.ViewStubActivity">
<ViewStub
android:id="@+id/view_stub_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="10dp"
android:layout="@layout/view_stub_test"/>
<ViewStub
android:id="@+id/view_stub_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout="@layout/view_stub_image_test"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom">
<Button
android:id="@+id/show_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:textSize="18sp"
android:text="ShowText" />
<Button
android:id="@+id/show_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:text="ShowImage"
android:textSize="18sp"/>
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container_error_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/view_stub_textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#0E1C25"
android:textColor="#FFFFFFF"
android:textSize="18sp"/>
</LinearLayout>
<?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">
<ImageView
android:id="@+id/view_stub_imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
private ViewStub viewStub;
private Button buttonText;
private Button buttonImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_stub);
buttonText = findViewById(R.id.show_text);
buttonImage = findViewById(R.id.show_image);
buttonText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ViewStub textStub = findViewById(R.id.view_stub_text);
textStub.inflate(); // 或者使用textStub.setVisibility(View.VISIBLE);
TextView textView = findViewById(R.id.view_stub_textview);
textView.setText("niuniu");
}
});
buttonImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ViewStub imageStub = findViewById(R.id.view_stub_image);
imageStub.inflate(); // 或者使用imageStub.setVisibility(View.VISIBLE);
ImageView imageView = findViewById(R.id.view_stub_imageview);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.niuniu);
imageView.setImageBitmap(bitmap);
}
});
}
- 初次加载(并没有加载Text和Image)

- 显示文字

- 显示图片

注意
- ViewStub只能被Inflate或者setVisibility一次,Inflate或者setVisibility之后将其指向布局文件中的ViewStub并将其进行替换(替换后,布局中就没有ViewStub)
- ViewStub只能用来Inflate一个布局文件,而不是某个具体的View(可以把某一个View写到布局文件中)
- ViewStub中的控件的布局位置属性要加在ViewStub中,如果是加在控件上面 ,位置属性就会失效