ViewStub的详细用法

一、ViewStub概述

ViewStub是Android中一个比较好用的工具类,可以让我们在布局中预先设置一些不常用的View,当需要使用时才加载进来,可以优化布局加载时间和内存开销。使用ViewStub可以将布局层次扁平化,以提高布局性能。

ViewStub的优点:

  • 方便:可以增加应用程序的负载效率。
  • 简单:加入的布局很简单,在XML文件使用。
  • 高效:由于布局的添加是动态的进行,内存占用量更小。
  • 快速:提高布局加载速度。

二、ViewStub的使用

1.在布局文件中添加ViewStub

可以在布局文件中添加ViewStub标签,通过设置android:layout布局参数设置ViewStub的位置,code示例如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--其他View省略-->

    <ViewStub
        android:id="@+id/view_stub"
        android:layout="@layout/custom_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

2.在Java文件中进行ViewStub的替换

在Java代码中可以使用ViewStub的inflate()方法将StubView替换为真正的View,并添加到布局中。在这个例子中,被inflate的布局叫做custom_layout.xml

ViewStub viewStub = findViewById(R.id.view_stub);
View inflatedView = viewStub.inflate();

3.使用ViewStub的setVisibility()

也可以使用setVisibility()方法,将ViewStub替换为相应的真正View。

ViewStub viewStub = findViewById(R.id.view_stub);
viewStub.setVisibility(View.VISIBLE);

4.使用ViewStub的getInflatedId()

可以使用getInflatedId()方法获取被inflate的View的ID。

ViewStub viewStub = findViewById(R.id.view_stub);
int layoutId = viewStub.getInflatedId();

三、ViewStub原理

ViewStub本质上是一个代理View,当ViewStub替换为真正的View之后,ViewStub就不再存在,成为了普通的View。

可以通过以下方式查看ViewStub的监听事件:

ViewStub viewStub = findViewById(R.id.view_stub);
viewStub.setOnInflateListener(new ViewStub.OnInflateListener() {
     @Override
     public void onInflate(ViewStub stub, View inflated) {
         Log.d("ViewStubDemo", "inflate()");
     }
});

四、ViewStub的扩展

基于ViewStub的原理,可以通过扩展ViewStub做一些有意思的功能。

1.自定义ViewStub

可以扩展ViewStub实现自定义的StubView,提供创建的接口。

public class MyViewStub extends ViewStub {
    private View mInflated = null;
    private int mLayoutId;

    public interface OnInflateListener {
        void onInflated(MyViewStub stub, View inflated);
    }

    private OnInflateListener mListener;

    public MyViewStub(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setLayoutResource(int layoutId) {
        mLayoutId = layoutId;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (mInflated == null) {
            setVisibility(View.GONE);
            LayoutInflater inflater = LayoutInflater.from(getContext());
            View view = inflater.inflate(mLayoutId, this, true);
            if (mListener != null) {
                mListener.onInflated(this, view);
            }
            mInflated = view;
        }
        else {
            setMeasuredDimension(mInflated.getMeasuredWidth(),
                    mInflated.getMeasuredHeight());
        }
    }

    public void setOnInflateListener(OnInflateListener listener) {
        mListener = listener;
    }
}

自定义的ViewStub可以在布局文件中使用。

<com.example.myviewstub.MyViewStub
    android:id="@+id/my_view_stub"
    android:layout="@layout/custom_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

在Java文件中可以使用如下代码进行ViewStub的替换(和ViewStub使用类似):

MyViewStub myViewStub = findViewById(R.id.my_view_stub);
myViewStub.setLayoutResource(R.layout.custom_layout);
View inflatedView = myViewStub.inflate();

2.ViewStub的懒加载

可以扩展ViewStub实现懒加载的StubView,可以控制是否需要加载。

public class LazyViewStub extends ViewStub {
    private boolean mIsVisibleToUser;
    private boolean mHasLoadOnce = false;

    public LazyViewStub(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setVisibleToUser(boolean isVisibleToUser) {
        mIsVisibleToUser = isVisibleToUser;
        if (isVisibleToUser && !mHasLoadOnce) {
            inflate();
            mHasLoadOnce = true;
        }
    }
}

使用懒加载的ViewStub时,需要在Java代码中控制是否需要加载。

LazyViewStub lazyViewStub = findViewById(R.id.lazy_view_stub);
lazyViewStub.setLayoutResource(R.layout.custom_layout);
lazyViewStub.setVisibleToUser(isVisibleToUser);

五、总结

ViewStub是Android中一个方便、简单、高效和快速的工具类,可以优化布局加载时间和内存开销。除此之外,还可以扩展ViewStub实现一些有意思的功能,例如自定义StubView和懒加载。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/249898.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 17:13
下一篇 2024-12-12 17:13

相关推荐

  • index.html怎么打开 – 详细解析

    一、index.html怎么打开看 1、如果你已经拥有了index.html文件,那么你可以直接使用任何一个现代浏览器打开index.html文件,比如Google Chrome、…

    编程 2025-04-25
  • Resetful API的详细阐述

    一、Resetful API简介 Resetful(REpresentational State Transfer)是一种基于HTTP协议的Web API设计风格,它是一种轻量级的…

    编程 2025-04-25
  • AXI DMA的详细阐述

    一、AXI DMA概述 AXI DMA是指Advanced eXtensible Interface Direct Memory Access,是Xilinx公司提供的基于AMBA…

    编程 2025-04-25
  • 关键路径的详细阐述

    关键路径是项目管理中非常重要的一个概念,它通常指的是项目中最长的一条路径,它决定了整个项目的完成时间。在这篇文章中,我们将从多个方面对关键路径做详细的阐述。 一、概念 关键路径是指…

    编程 2025-04-25
  • neo4j菜鸟教程详细阐述

    一、neo4j介绍 neo4j是一种图形数据库,以实现高效的图操作为设计目标。neo4j使用图形模型来存储数据,数据的表述方式类似于实际世界中的网络。neo4j具有高效的读和写操作…

    编程 2025-04-25
  • c++ explicit的详细阐述

    一、explicit的作用 在C++中,explicit关键字可以在构造函数声明前加上,防止编译器进行自动类型转换,强制要求调用者必须强制类型转换才能调用该函数,避免了将一个参数类…

    编程 2025-04-25
  • HTMLButton属性及其详细阐述

    一、button属性介绍 button属性是HTML5新增的属性,表示指定文本框拥有可供点击的按钮。该属性包括以下几个取值: 按钮文本 提交 重置 其中,type属性表示按钮类型,…

    编程 2025-04-25
  • crontab测试的详细阐述

    一、crontab的概念 1、crontab是什么:crontab是linux操作系统中实现定时任务的程序,它能够定时执行与系统预设时间相符的指定任务。 2、crontab的使用场…

    编程 2025-04-25
  • Vim使用教程详细指南

    一、Vim使用教程 Vim是一个高度可定制的文本编辑器,可以在Linux,Mac和Windows等不同的平台上运行。它具有快速移动,复制,粘贴,查找和替换等强大功能,尤其在面对大型…

    编程 2025-04-25
  • 网站测试工具的详细阐述

    一、测试工具的概述 在软件开发的过程中,测试工具是一个非常重要的环节。测试工具可以快速、有效地检测软件中的缺陷,提高软件的质量和稳定性。与此同时,测试工具还可以提高软件开发的效率,…

    编程 2025-04-25

发表回复

登录后才能评论