文章目录
- 1、简介
- 2、结构布局
- 3、功能文件
1、简介
打开 activity 的时候,减少一些布局的加载。加快activity 显示的速度
2、结构布局
3、功能文件
- test_view_stub.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" >
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/text_id"
android:text="Hello Test ViewStub"
android:textSize="30dp"
android:textColor="@color/colorAccent">
</TextView>
</LinearLayout>
2) activity_main.xml 文件
主界面 布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.lum.myapplication.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="40dp"
android:onClick="onClick"/>
<ViewStub
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/viewStub"
android:layout="@layout/test_view_stub"
android:inflatedId="@+id/replace_view_stub"/>
</LinearLayout>
3) MainActivity.java
功能文件
package com.example.lum.myapplication;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewStub;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private ViewStub viewStub;
View viewStubGetView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewStub = (ViewStub) findViewById(R.id.viewStub);
}
/*
① inflate操作只能进行一次,因为inflate的时候是将其指向的布局文件解析inflate 并替换掉当前ViewStub本身
(由此体现出了ViewStub“占位符”性质),一旦替换后,此时原来的布局文件中就没有ViewStub控件了
②句不需要,如果用到setvisibility的话,那么①②两句顺序不可颠倒,否则报错
java.lang.IllegalStateException:ViewStub must have a non-null ViewGroup viewParent,
因为viewstub不能反复inflate,只能inflate一次,setVisibility会间接调用inflate
③ viewStub 已经被替换 原来id找不到了
* */
public void onClick(View view) {
if (viewStubGetView == null)
viewStubGetView = viewStub.inflate();// ①
//viewStub.setVisibility(View.VISIBLE);// ②
TextView textView = (TextView) viewStubGetView.findViewById(R.id.text_id);
textView.setText("testView show");
textView.setVisibility(View.VISIBLE);
View viewStub = (ViewStub) findViewById(R.id.viewStub);//③
if (viewStub == null)
Log.i("TAG","viewStub 已经被替换");
}
}
文件参考:
merge、include、ViewStub的作用及分析
https://blog.51cto.com/weijiancheng/2085997