欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ViewStub使用

程序员文章站 2022-03-20 13:03:05
...

 

一、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
        }
    }

 

相关标签: ViewStub