Android UI 优化<merge/> <include/> <ViewStub>

本文介绍了Android开发中&lt;merge/&gt;、&lt;include/&gt;及&lt;ViewStub&gt;标签的应用技巧,通过减少不必要的视图嵌套提高UI性能,并实现视图的延迟加载。

本文通过实例来分析和介绍<merge/><include/><ViewStub>标签。

merge :混合、融入、相融。

include :包括、包含。

ViewStub:延迟加载


一.<merge/>

        The <merge /> tag helps eliminate redundant view groups in your view hierarchy when including one layout within another. For example, if your main layout is a vertical LinearLayout in which two consecutive views can be re-used in multiple layouts, then the re-usable layout in which you place the two views requires its own root view. However, using another LinearLayout as the root for the re-usable layout would result in a vertical LinearLayout inside a vertical LinearLayout. The nested LinearLayout serves no real purpose other than to slow down your UI performance.

       <merge/>标签有助于消除冗余试图组在你的层次视图层次布局包含另一个的时候,例如,你的主要布局是连续的两视图可以重复使用在多个垂直线性布局中,其次可以重复使用和需要自己的根视图,然而,使用另一个线性布局作为根布局重用布局将会导致垂直线性布局包含垂直线性布局,嵌套的线性布局并没有什么实际意义,只会减慢你的UI性能。

        假如你的Activity要加载一个布局,不管你的xml文件的跟节点是啥,Activity加载布局会给一个默认的根布局,一般是FrameLayout,如果你的xml文件本身就是一个Layout的布局,这样以来,事实上你加载到Activity中的布局有两个视图嵌套,这样是完全没有必要的,只会浪费资源。

例子:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:background="@drawable/ic_launcher" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|bottom"
        android:layout_marginBottom="20dip"
        android:background="#AA000000"
        android:padding="12dip"
        android:text="HelloWorld"
        android:textColor="#ffffffff" />

</FrameLayout>
启动之后用hierarchyviewer.bat工具查看绘制情况:可见有两个FrameLyout嵌套在了一起。



然后我们把FrameLayout替换为merge试试看:去掉了冗余的FrameLayout

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:background="@drawable/ic_launcher" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|bottom"
        android:layout_marginBottom="20dip"
        android:background="#AA000000"
        android:padding="12dip"
        android:text="HelloWorld"
        android:textColor="#ffffffff" />

</merge>


注意:当你的Activity所使用的根节点是FrameLayout时才可以用,当使用Include或者ViewStub从外部导入布局的时候,可以将被导入的xml的根节点用merge作为根节点。这样当被嵌入父级结构中是就很好的融入了,并且没有冗余。

二.<include/>

include就相对很好理解了,它的功能就是加载一个单独的布局到当前视图,可以重复加载。

1.使用 layout="" 属性来加载一个布局

2.可以定义Id,定义id后被加载的视图的id被覆盖

3.可以使用layout_*=""

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >

    
    <include layout="@layout/aaaa"/>

</merge>

三.<ViewStub/>

在UI开发时我们需要控制视图的显示与隐藏,比如加载进度条等等的,一般我们通过控制Visibility为VISIABLE和GONE来控制显示与隐藏。

但是它的缺点就是,耗费资源。虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。但是它的缺点就是,耗费资源。虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源

推荐的做法是使用android.view.ViewStub,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所向的布局就会被Inflate和实例化,然后ViewStub的布局属性都会传给它所指向的布局。这样,就可以使用ViewStub来方便的在运行时,要还是不要显示某个布局。

ViewStub适用情况:

1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。       2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。

布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ViewStub
        android:id="@+id/viewstub_demo_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dip"
        android:layout_marginRight="5dip"
        android:layout_marginTop="10dip"
        android:layout="@layout/viewstub_demo_text_layout" />

</FrameLayout>
子布局:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="Are you OK? I will give everyone a free Mbing" >
    

</TextView>

代码:

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout);
		ViewStub viewStub = (ViewStub) findViewById(R.id.viewstub_demo_text);
		viewStub.inflate();//填充
	}
}


STM32F767单片机开发板实验例程HAL库版本60个软件工程源码合集:STM32F7开发指南-HAL库版本_V1.1.pdf实验0-1 Template工程模板-新建工程章节使用实验0-2 Template工程模板-调试章节使用实验0-3 Template工程模板-使用STM32CubeMX配置实验1 跑马灯实验实验10 电容触摸按键实验实验11 OLED显示实验实验12 内存保护(MPU)实验实验13 TFTLCD(MCU屏)实验实验14 SDRAM实验实验15 LTDC LCD(RGB屏)实验实验16 USMART调试试验实验17 RTC实时时钟实验实验18 随机数发生器实验实验19 待机唤醒实验实验2 按键输入实验实验20 ADC实验实验21 内部温度传感器实验实验22 DAC实验实验23 PWM DAC实验实验24 DMA实验实验25 IIC实验实验26 IO扩展实验实验27 光照&接近传感器实验实验28 QSPI实验实验29 485实验实验3 串口通信实验实验30 CAN实验实验31 触摸屏实验实验32 红外遥控实验实验33 DS18B20数字温度传感器实验实验34 DHT11数字温湿度传感器实验实验35 MPU9250九轴传感器实验实验36 NRF24L01无线通信实验实验37 FLASH模拟EEPROM实验实验38 摄像头实验实验39 内存管理实验实验4 外部中断实验实验40 SD卡实验实验41 NAND FLASH实验实验42 FATFS实验实验43 汉字显示实验实验44 图片显示实验实验45 硬件JPEG解码实验实验46 照相机实验实验47 音乐播放器实验实验48 录音机实验实验49 SPDIF(光纤音频)实验实验5 独立看门狗实验实验50 视频播放器实验实验51 FPU测试(Julia分形)实验实验52 DSP测试实验实验53 手写识别实验实验54 T9拼音输入法实验实验55 串口IAP实验实验56 USB读卡器(Slave)实验实验57 USB声卡(Slave)实验实验58 USB虚拟串口(Slave)实验实验59 USB U盘(Host)实验实验6 窗口看门狗实验实验60 USB鼠标键盘(Host)实验实验61 网络通信实验实验62 UCOSII实验1-1-任务调度实验62 UCOSII实验1-2-任务创建删除挂起恢复实验63 UCOSII实验2-信号量和邮箱实验64 UCOSII实验3-消息队列、信号量和软件定时器实验7 定时器中断实验实验8 PWM输出实验实验9 输入捕获实验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值