高级UI<第八篇>:ViewStub详解

作者: NoBugException | 来源:发表于2019-11-23 20:02 被阅读0次

    上一篇中提到ViewStub控件,这个控件被用作状态栏的占位符,所以,这篇文章就说说ViewStub控件吧。

    (1)简介

    ViewStub 是一个轻量级的View,没有尺寸,不绘制任何东西,因此绘制或者移除时更省时。(ViewStub不可见,大小为0)

    (2)优缺点
    • 优点

    实现View的延迟加载,避免资源的浪费,减少渲染时间,在需要的时候才加载View

    • 缺点
    1. ViewStub所要替代的layout文件中不能有<merge>标签
    2. ViewStub在加载完后会被移除,或者说是被加载进来的layout替换掉了。
    (3)使用

    第一步,在布局中添加ViewStub

    <ViewStub
        android:id="@+id/status_bar"
        android:inflatedId="@+id/inflate_status_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout="@layout/statusbar"
        android:background="@android:color/black" />
    
    ViewStub status_view = findViewById(R.id.status_bar);
    status_view.setVisibility(View.VISIBLE);
    //或者
    //status_view.inflate();
    

    我们必须了解以下两点

    • ViewStub即使在xml中声明了,也不会显示,因为它的大小为0,只有调用setVisibility(View.VISIBLE)或者inflate()之后才会将ViewStub替换为你预先加载的statusbar布局,也就是android:layout="@layout/statusbar"
    • id和inflatedId的区别?
      id是ViewStub自身的id, 而inflatedId是layout的id,当执行setVisibility(View.VISIBLE)或者inflate()之后(也就是说ViewStub被layout替代),原来的ViewStub就不能通过id获取了
    (4)作用

    由于ViewStub本身大小为0,所以无需做多余的渲染(主要是onMeasureonLayoutonDraw),避免了资源的浪费,所以常常运用于view的预加载,比如自定义标题栏,其实我们手机的状态栏就是采用ViewStub来实现的。

    [本章完...]

    相关文章

      网友评论

        本文标题:高级UI<第八篇>:ViewStub详解

        本文链接:https://www.haomeiwen.com/subject/lrqhwctx.html