本文主要是介绍ViewStub的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一个例子
点击按钮前
点击按钮后
UI布局文件
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_horizontal"><TextViewandroid:id="@+id/title"android:background="#aaccaa"android:layout_width="match_parent"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/show"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="显示"/><ViewStubandroid:id="@+id/viewstub1"android:layout_width="match_parent"android:layout_height="100dp"android:layout="@layout/viewstub_layout"/><TextViewandroid:id="@+id/title_below_viewstub"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ccaaaa"android:text="ViewStub下面的控件" /></LinearLayout>
viewstub_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:background="#cccccc"android:layout_width="match_parent"android:layout_height="200dp"><TextViewandroid:id="@+id/viewstub1_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="得意不忘形,失意不失志"android:textSize="16sp"/> </LinearLayout>
代码
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;@Overrideprotected 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();}@Overridepublic 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);} }
可以发现
- 点击按钮之前:
- ViewStub 关联到的子TextView 为null。
- ViewStub控件不为null。
- 点击按钮之后:
- ViewStub 关联到的子TextView 为不为null。
- ViewStub控件 为null。
- ViewStub开始时并没有显示。
ViewStub的实现
继承自View
开始时,ViewStub并没有显示
因为在构造器里已经设置了GONE。
调用inflate时
可知:
使用ViewStub时,会首先把当前View(仅是当前View)添加到父容器。当调用inflate方法时,会把layout指定的xml inflate出来,然后移除当前View,把刚才inflate出来的view返回。
通过文档
setVisibility方法也可以完成对ViewStub的替换。查看代码,当未调用inflate时,mInflatedViewRef为空,会走进inflate调用,因此,setVisibility(View.Visible),也可以起到layout对ViewStub的替换。
建议:
当inflate执行之后,实际上ViewStub已经从父容器中移除,当前只有mViewStub引用到,并且不再使用。最好把mViewStub赋值为null。
这篇关于ViewStub的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!