Android开发--ViewStub惰性装载空间介绍

2024-02-26 06:38

本文主要是介绍Android开发--ViewStub惰性装载空间介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、ViewStub控件出现的原因

大家应该了解过<include>标签,该标签可以在布局文件中引用另外一个布局文件,并可以覆盖被引用布局文件的相关属性,也就是以android:layout开头的属性。用这个标签可以将一个非常庞大的布局文件分解成若干个较小的布局文件,而且这些小的布局文件可以被多次引用,从而达到一个重用的目的。

按道理没有什么问题,但实则存在一个问题就是布局文件中的孔家并不一定在程序启动时全都用到,有些控件只在特定的情况下才会被引用到。因此在使用<include>标签时,不管三七二十一,先把全部控件加载到内存中,这样就造成了内存的浪费,也许大家会说一个例如像进度条之类的控件并不会占用多少内存,装载了也无所谓,也许这样理解也是对的,但是如果是想ImageView控件,这样占用的资源就很多,对于手机内存小的用户来说,也就有影响了,所以这里就介绍ViewStub控件的机制,养成良好的编程素养总是有好处的。

二、ViewStub控件简单介绍

ViewStub是不可视控件,它的作用与<include>标签基本相同,在布局文件中使用<ViewStub>标签来引用其他的布局文件,但与<include>唯一不同的是ViewStub并不会马上装载引用的布局文件,只有在调用了ViewStub.inflate或ViewStub.setVisibility(View.VISIBLE)方法后,ViewStub才会装载引用的控件。

三、ViewStub控件使用简例

 主配置文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击按钮加载viewstub引用的布局文件"
        tools:context=".MainActivity" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="点击加载" />
   
    <ViewStub
        android:id="@+id/viewstub"
        android:inflatedId="@+id/buttonid"
        android:layout="@layout/viewstubbtn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
 
    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="下面的是include引用的布局文件" />
   <include layout="@layout/includebtn"/>
</LinearLayout>

另外两个配置文件,includebtn被include标签引用,viewstubbtn被viewstub标签引用,

includebtn.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/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是被include进来的" />

</LinearLayout>

 

viewstubbtn.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/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是被viewstub进来的" />

</LinearLayout>

 

主程序:

package com.example.viewstubtest;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.ViewStub;
import android.widget.Toast;

public class MainActivity extends Activity {


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

 public  void onClick(View v){
     v = findViewById(R.id.viewstub);
     //ViewStub控件只能被加载一次,第二次使用findViewById获得该对象,则返回null
     if(v != null){
      ((ViewStub)v).setVisibility(View.VISIBLE);
     }
     else{
      Toast.makeText(this, "组建已加载", Toast.LENGTH_SHORT);
     }
     
    }

}

 


 

这篇关于Android开发--ViewStub惰性装载空间介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/747968

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【