一、ViewStub是什么?
<ViewStub>
标签实质上是一个宽高都为 0 的不可见 的轻量级View。通过延迟按需加载布局的方式提升页面加载速度。
二、ViewStub使用场景
某布局默认是不可见,当满足特定场景才显示。比如网络异常提示、引导页等。
三、ViewStub怎么使用?
1、创建布局文件layout_test.xml(注:根标签可以是布局或控件,但不能为<merge>,子标签可以使用<merge>)
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:text="test"/>
2、通过ViewStub的android:layout指定懒加载的布局layout_test.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">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="测试" />
<ViewStub
android:id="@+id/viewStub"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout="@layout/layout_test" />
</LinearLayout>
3、显示/隐藏布局
(1)只在满足条件进行显示
//方法1
viewStub.inflate()
//方法2
viewStub.visibility = View.VISIBLE
注:ViewStub只能被Inflate一次,inflate之后ViewStub对象会被置空,就不能够再通过ViewStub来控制显隐。其中方法2内部也是通过调用inflate,所有ViewStub的setVisibility()和inflate()都只能调用一次
(2)需要根据条件进行显隐控制(通过ViewStub.inflate()返回的根布局进行显隐操作)
private var mIsVisiable = false
private val mView: View by lazy { viewStub.inflate() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
if (mIsVisiable){
mView.visibility = View.INVISIBLE
}else{
mView.visibility = View.VISIBLE
}
mIsVisiable = !mIsVisiable
}
}