ViewStub的实现

一个例子

点击按钮前

ViewStub的实现_第1张图片

点击按钮后

ViewStub的实现_第2张图片

UI布局文件

activity_main.xml



    
    

viewstub_layout.xml



    

代码

package com.jue.myviewstub;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewStub;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView mTitle;
    private Button button;

    private ViewStub mViewStub;
    private TextView mViewStubTitle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTitle = (TextView) findViewById(R.id.title);
        mTitle.setText("");
        button = (Button) findViewById(R.id.show);
        button.setOnClickListener(this);

        setTitleInfo();
    }

    @Override
    public void onClick(View v) {
        mViewStub.inflate();

        setTitleInfo();
    }

    private void setTitleInfo() {
        mViewStub = (ViewStub) findViewById(R.id.viewstub1);
        mViewStubTitle = (TextView) findViewById(R.id.viewstub1_title);

        String title1 = mViewStub == null ? "ViewStub 空--" : "ViewStub  非空++";
        String title2 = mViewStubTitle == null ? "ViewStub 子View 空--" : "ViewStub 子View  非空++";


        mTitle.setText(title1 + "\n" + title2);
    }
}

可以发现

  1. 点击按钮之前:
    • ViewStub 关联到的子TextView 为null。
    • ViewStub控件不为null。
  2. 点击按钮之后:
    • ViewStub 关联到的子TextView 为不为null。
    • ViewStub控件 为null。
  3. ViewStub开始时并没有显示。

ViewStub的实现

继承自View


开始时,ViewStub并没有显示

因为在构造器里已经设置了GONE。

ViewStub的实现_第3张图片

调用inflate时

ViewStub的实现_第4张图片

可知:

使用ViewStub时,会首先把当前View(仅是当前View)添加到父容器。当调用inflate方法时,会把layout指定的xml inflate出来,然后移除当前View,把刚才inflate出来的view返回。

通过文档

setVisibility方法也可以完成对ViewStub的替换。查看代码,当未调用inflate时,mInflatedViewRef为空,会走进inflate调用,因此,setVisibility(View.Visible),也可以起到layout对ViewStub的替换。

ViewStub的实现_第5张图片

建议:

当inflate执行之后,实际上ViewStub已经从父容器中移除,当前只有mViewStub引用到,并且不再使用。最好把mViewStub赋值为null。

你可能感兴趣的:(android)