ViewSub

一、ViewSub的概念及使用
 ViewStub 是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。
当ViewStub可见,或者调用 inflate()函数时,才会加载这个布局资源文件。
 该ViewStub在加载视图时在父容器中替换它本身。因此,ViewStub会一直存在于视图中,直到调用setVisibility(int) 或者inflate()为止。ViewStub的布局参数会随着加载的视图数一同被添加到ViewStub父容器。同样,你也可以通过使用inflatedId属性来定义或重命名要加载的视图对象的Id值。例如:
<ViewStub
        android:inflatedId="@+id/vs"
        android:layout="@layout/sub_info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
通过"vs"id可以找到被定义的ViewStub对象。加载布局资源文件"sub_info"后, ViewStub对象从其父容器中移除。
执行加载布局资源文件的推荐方式如下:
ViewStub stub = (ViewStub)findViewById(R.id.vs);
  View view = stub.inflate();
  stub.setOnInflateListener(new OnInflateListener() {
   
   @Override
   public void onInflate(ViewStub stub, View inflated) {
   
   }
  });
当inflate()被调用, 这个ViewStub被加载的视图替代并且返回这个视图对象。
ViewStub.OnInflateListener      一个用于接收ViewStub已经成功加载布局资源文件的通知的监听器。
二、ViewSub的属性
XML属性
相关方法
描述
 android:inflatedId
setInflatedId(int)
覆盖待加载的视图id
 android:layout
setLayoutResource(int)
要引用的布局资源
三、ViewSub的常用方法

 public void draw (Canvas canvas)

手动在指定的画布绘制这个视图(及所有其子视图)。这个视图必须在调用这个函数之前做好了整体布局。当要自己实现一个视图时,不要重载这个方法;相反,你应该重载onDraw(Canvas)方法。(译者注:主要用于自定义的视图组件的方法。

参数 canvas    这个画布传到那个已渲染的视图对象。 

public int getInflatedId ()

返回加载的布局资源文件的ID,如果加载的布局资源文件的idNO_ID,那么这个加载的View将保留它原来的id值。

                   相关XML 属性

                            android:inflatedId

                   返回值

                            一个正整数来标识这个要加载的视图或者NO_ID将保持加载视图原来的id

                   参见

                            setInflatedId(int)

 public int getLayoutResource () 

返回加载的布局资源文件的id值。

                   相关XML 属性

                            android:layout

                   返回值

                            加载到视图对象的布局资源文件id值。

                   参见

                            setLayoutResource(int)

                            setVisibility(int)

                            inflate()

 public View inflate ()

加载getLayoutResource()方法标识的布局资源,并通过加载布局资源替换父容器中它自己。

                   返回值

                            这个已加载的布局资源文件.

public void setInflatedId (int inflatedId)

设置加载视图的ID。如果这个idNO_ID,这个加载视图保持它原来的id不变。

                   相关XML 属性

                            android:inflatedId

                   参数

                            inflatedId         一个正整数来标识这个加载视图或者NO_ID将保持加载视图原来的id

                   参见

                            getInflatedId()

public void setLayoutResource (int layoutResource)

设置待加载的布局资源文件,当ViewStub被设置为visibleinvisible或调用inflate()时使用。这个在加载布局资源文件时创建的视图用来在父容器中替换它自己。

                   相关XML 属性

                            android:layout

                   参数

                            layoutResource       一个有效的布局资源文件id值(不等于0)。

                   参见

                            getLayoutResource()

                            setVisibility(int)

                            inflate()

public void setOnInflateListener(ViewStub.OnInflateListener inflateListener)

 设置成功加载布局资源文件后事件通知的监听器。

                 参数

                            inflateListener         OnInflateListener在成功加载后得到事件通知。

                 参见

                            ViewStub.OnInflateListener

public void setVisibility (int visibility)

当可见性设置为VISIBLEINVISIBLEinflate()将被调用,并且加载视图资源在父容器中替换ViewStub

                   参数

                            visibility 设置为VISIBLE(显示), INVISIBLE(隐藏) GONE(完全隐藏,不暂用布局位置).

                   参见

                            inflate()  

 protected void dispatchDraw (Canvas canvas)

调用这个函数去绘制这个控件的子视图。可以通过派生类重写在绘制子类之前获取控制(但是是在他自己的视图已经被绘制完之后)

                  参数

                            canvas    这个画布传到那个已渲染的视图对象。   

 protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

测量这个视图以确定其内容的高度和宽度。通过measure(int, int)来调用这个方法,并且应该由子类重写以提高内容测量的效率和精确度。

约定:当该方法被重写时,你必须调用setMeasuredDimension(int, int)来存储已测量视图的高度和宽度。否则将通过measure(int, int)抛出一个IllegalStateException异常。

调用父类的onMeasure(int, int)方法是一个有效的办法。

父类的实现是以背景大小为默认大小,除非MeasureSpec(测量细则)允许更大的背景。为了更好测量内容子类应该重写onMeasure(int, int)

如果这个方法被重写,子类有责任确保测量它的高度和宽度至少是视图的最小宽度和高度(getSuggestedMinimumHeight()getSuggestedMinimumWidth())。


参数

  widthMeasureSpec         由于父类有横向空间要求,参见View.MeasureSpec

         heightMeasureSpec         由于父类有纵向空间要求,参见 View.MeasureSpec  

你可能感兴趣的:(ViewSub)