关闭

用ViewStub优化布局

标签: Android布局优化
416人阅读 评论(0) 收藏 举报
分类:

Google有关ViewStub 的介绍:

“ViewStub 是一种不可视并且大小为 0 的视图,可以延迟到 运行时填充(inflate)布局资源。当 ViewStub
设置为可视或者 inflate() 方法被调用后,就会填充布局资源,然后 ViewStub 便会 被填充的视图替代。”
使用特点:

  • 最佳用途就是实现View的延迟加载,避免资源浪费,在需要的时候才加载View
  • 如果是经常要来回切换ViewStub的显示和隐藏,ViewStub就不适用

先看一个简单的代码:

MainActivity

public class MainActivity extends AppCompatActivity {
    private Button mBtnShow;
    private ViewStub mViewStub;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtnShow = (Button) findViewById(R.id.btn_show);
        mViewStub = (ViewStub) findViewById(R.id.viewStub);
        mBtnShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //两种方法都可以显示ViewStub中的内容
//                mViewStub.inflate();
                mViewStub.setVisibility(View.VISIBLE);
            }
        });
    }
}

activity_main.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"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Show ViewStub"
        android:textAllCaps="false" />

    <ViewStub
        android:id="@+id/viewStub"
        android:layout="@layout/content"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:inflatedId="@+id/content_stub" />

</LinearLayout>

content.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/tv_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent"
    android:text="ViewStub 是一种不可视并且大小为 0 的视图,可以延迟到 运行时填充(inflate)布局资源。当 ViewStub
设置为可视或者 inflate() 方法被调用后,就会填充布局资源,然后 ViewStub 便会 被填充的视图替代。"
    tools:showIn="@layout/activity_main" />

这就是ViewStub的简单使用

需要注意两个异常:

java.lang.IllegalArgumentException: ViewStub must have a valid layoutResource

android:layout=”@layout/content”
ViewStub标签里面用的@layout 前面是android:layout include里面是layout
写错了会抛出上面的异常

java.lang.IllegalStateException: ViewStub must have a non-null ViewGroup viewParent

当ViewStub inflate后,这个ViewStub就从View层次中移除了。(findViewById(R.id.viewStub)也会返回null)
所以MainActivity中mViewStub.inflate(); 应该这样写:

public class MainActivity extends AppCompatActivity {
    private Button mBtnShow;
    private ViewStub mViewStub;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtnShow = (Button) findViewById(R.id.btn_show);
        mBtnShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mViewStub = (ViewStub) findViewById(R.id.viewStub);
                if (mViewStub != null) {
                    mViewStub.inflate();
                }
            }
        });
    }
}

inflate()和setVisibility(View.VISIBLE);

这两个放到都可以显示ViewStub的视图
setVisibility(View.VISIBLE)会调用inflate()方法
inflate()方法可以返回当前的View

 View stubView = mViewStub.inflate();

ViewStub中的layout_width 和 layout_height

来上一张图:
这里写图片描述
我在ViewStub标签里面的width和height如下:

android:layout_width="match_parent"
android:layout_height="300dp"

在@layout/content中如下

android:layout_width="match_parent"
android:layout_height="match_parent"

可以看到, ViewStub标签里面的width和height属性会覆盖掉填充的布局的属性.

android:inflatedId=”@+id/content_stub”

mBtnShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mViewStub = (ViewStub) findViewById(R.id.viewStub);
                if (mViewStub != null) {
                    mViewStub.inflate();
                    ((TextView) findViewById(R.id.content_stub)).setText("我只是一个不明真相的吃瓜群众");
                }
            }
        });

现在把 android:inflatedId=”@+id/content_stub” 去掉

mBtnShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mViewStub = (ViewStub) findViewById(R.id.viewStub);
                if (mViewStub != null) {
                    mViewStub.inflate();
                    ((TextView) findViewById(R.id.tv_content)).setText("我只是一个不明真相的吃瓜群众");
                }
            }
        });

这里写图片描述

可以看到, android:inflatedId=”@+id/content_stub”会覆盖content.xml中根元素的id属性, 这个属性可以不添加.

再看这里

 mBtnShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mViewStub = (ViewStub) findViewById(R.id.viewStub);
                if (mViewStub != null) {
                    ((TextView) mViewStub.inflate()).setText("我只是一个不明真相的吃瓜群众");
                }
            }
        });

可以看到, mViewStub.inflate()返回的也是content.xml中的TextView.(content.xml的根元素)

0
0
查看评论

Android UI布局优化之ViewStub

在设计模式的单利模式中,懒汉式和饿汉式是其中两种。 一种是在类被加载的时候就完成单例对象的初始化,一种是在需要使用该单例的时候才初始化。 在android的视图设计中,同样需要使用的这样的设计模式。 这样的视图加载起来需要耗费很多的时间。在这几百个视图里面,可能有部分视图是在点击某一按钮也就是...
  • a740169405
  • a740169405
  • 2016-01-15 13:50
  • 2872

【移动开发】布局优化利器<include/>和ViewStub

当创建复杂的布局的时候,有时候会发现添加了很多的ViewGroup和View。随之而来的问题是View树的层次越来越深,应用也变的越来越慢,因为UI渲染是非常耗时的。这时候就应该进行布局优化了。这里介绍两种方式,分别为标签和ViewStub类。使用是为了避免代码的重复。设想一种情况,我们需要为app...
  • manoel
  • manoel
  • 2014-09-04 00:24
  • 7796

Android 性能优化 三 布局优化ViewStub标签的使用

小黑与小白的故事,通过虚拟这两个人物进行一问一答的形式来共同学习ViewStub的使用 小白:Hi,小黑,ViewStub是什么?听说可以用来进行布局优化。 小黑:ViewStub 是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。(更多详细的API等信息可以查看官...
  • love_world_
  • love_world_
  • 2014-07-08 07:19
  • 6691

ViewStub动态加载布局提高UI加载性能

ViewStub 定位:ViewStub 是一个不可见,size 大小为0 的一个View ,用于运行时 延迟inflate layout布局的。当ViewStub 变为可见,或者 调用了inflate() 方法,这个Layout资源会被加载。然后ViewStub会将加载的View或者Views 替...
  • u011733020
  • u011733020
  • 2016-06-14 16:18
  • 1650

ViewStub和Gone区别

虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。 也就是说,会耗费内存等资源。     推荐的做法是使用android.view.ViewStub,ViewSt...
  • bazhongren
  • bazhongren
  • 2017-03-18 19:01
  • 499

ViewStub优化布局1

ViewStub按需加载布局,在布局初始化展示的时候,ViewStub指向的布局文件不会加载,在一定程度上节省了一些时间,是资源占用<ViewStub android:id="@+id/vs_feed_success" android:inf...
  • u012668925
  • u012668925
  • 2016-11-14 09:44
  • 96

Android抽象布局——include、merge 、ViewStub的区别

在布局优化中,Androi的官方提到了这三种布局、、,并介绍了这三种布局各有的优势,下面也是简单说一下他们的优势,以及怎么使用,记下来权当做笔记。 1、布局重用 标签能够重用布局文件,简单的使用如下: [html] view plaincopyprint? ...
  • u010897392
  • u010897392
  • 2015-04-17 15:00
  • 955

Android UI优化之ViewStub标签的使用

在前面两篇文章已经介绍了与标签的使用。 :http://blog.csdn.net/u012721519/article/details/51229107 :http://blog.csdn.net/u012721519/article/details/51229291 本文将主要介绍标用。 ...
  • u012721519
  • u012721519
  • 2016-04-24 01:24
  • 559

性能优化之布局优化篇一 使用ViewStub视图

一、概述 ViewStub是一个不显示且不占用布局空间的视图。ViewStub需要指定一个布局layout,在ViewStub初始化时,其指定的layout并未初始化。只有当ViewStub的setVisibility(VISIBLE/INVISIBLE)或inflate()方法被调用,ViewS...
  • ruancoder
  • ruancoder
  • 2016-09-02 19:28
  • 2232

Android布局优化之<merge>与<ViewStub>标签使用

merge标签:使用merge标签可以达到减少布局层级的作用,特别在配合include标签进行使用的时候,通过减少布局的层级数,可以优化APP在加载布局文件时的资源消耗,从而达到提高APP性能的效果。经典理解merge标签使用场景重现:现有布局A和布局B,A布局的代码如下:<LinearLay...
  • u011771755
  • u011771755
  • 2015-09-21 15:54
  • 1165
    个人资料
    • 访问:178437次
    • 积分:2835
    • 等级:
    • 排名:第14896名
    • 原创:108篇
    • 转载:11篇
    • 译文:0篇
    • 评论:25条
    文章分类
    最新评论