Android之Merge及自定义属性attrs.xml使用

简介:

   上午看了篇UI优化技巧的文章,《Android Layout Tricks #3: Optimize by merging》是关于<merge/>标签的使用,经常看到别人源码的布局文件使用到<merge/>这个标签,感觉很好奇,今天看了下android文档的表述以及示例有所了解。

   <merge/>的出现是为了优化android布局,减少视图树的层级。当LayoutInflater遇到这个标签时,它会跳过它,并将<merge />内的元素添加到<merge />的父元素里,从而达到减少层级。这里先看一个简单的布局文件。  

 


 
 
  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:layout_width="fill_parent" 
  3.     android:layout_height="fill_parent" > 
  4.  
  5.     <ImageView 
  6.         android:layout_width="fill_parent" 
  7.         android:layout_height="fill_parent" 
  8.         android:scaleType="center" 
  9.         android:src="@drawable/golden_gate" /> 
  10.  
  11.     <TextView 
  12.         android:layout_width="wrap_content" 
  13.         android:layout_height="wrap_content" 
  14.         android:layout_gravity="center_horizontal|bottom" 
  15.         android:layout_marginBottom="20dip" 
  16.         android:background="#AA000000" 
  17.         android:padding="12dip" 
  18.         android:text="Golden Gate" 
  19.         android:textColor="#ffffffff" /> 
  20.  
  21. </FrameLayout> 

上面的根目录是FrameLayout,里面包裹着ImageView以及TextView两个标签。

效果如下图:

 

使用HierarchyViewer 工具来查看该视图的层级效果,我们可以看到蓝色的矩形的就是我们刚刚的FrameLayout

的层数。

将FrameLayout改成merge,代码如下:

 


 
 
  1. <merge xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:layout_width="fill_parent" 
  3.     android:layout_height="fill_parent" > 
  4.  
  5.     <ImageView 
  6.         android:id="@+id/goldenIv" 
  7.         android:layout_width="fill_parent" 
  8.         android:layout_height="fill_parent" 
  9.         android:scaleType="center" 
  10.         android:src="@drawable/golden_gate" /> 
  11.  
  12.     <TextView 
  13.         android:layout_width="wrap_content" 
  14.         android:layout_height="wrap_content" 
  15.         android:layout_gravity="center_horizontal|bottom" 
  16.         android:layout_marginBottom="20dip" 
  17.         android:background="#AA000000" 
  18.         android:padding="12dip" 
  19.         android:text="Golden Gate" 
  20.         android:textColor="#ffffffff" /> 
  21.  
  22. </merge> 

我们看到的效果是这样的,蓝色的是用来包含之前FrameLayout的父标签,

现在直接包裹着ImageView和TextView两个子标签

这个就是merge的简单使用了。

下面再来一个实例,是自定义控件以及自定义属性的使用。

首先我们创建一个布局文件okcalcelbar_button.xml:

 


  
  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <Button xmlns:android="http://schemas.android.com/apk/res/android" 
  3. android:layout_width="wrap_content" 
  4. android:layout_height="wrap_content"/> 


再创建一个okcancelbar.xml的文件:
 

 


  
  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <merge xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="wrap_content" 
  4.     android:layout_height="wrap_content" > 
  5.     <include  
  6.         layout="@layout/okcalcelbar_button" 
  7.         android:id="@+id/okcancelbar_ok" 
  8.         /> 
  9.     <include  
  10.         layout="@layout/okcalcelbar_button" 
  11.         android:id="@+id/okcancelbar_cancel" 
  12.         /> 
  13. </merge> 

创建values下面创建自定义属性的文件attrs.xml

 


   
   
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.     <declare-styleable name="OkCancelBar">  
  4.         <attr name="okLabel" format="string"/>   
  5.        <attr name="cancelLabel" format="string"/>   
  6.     </declare-styleable>   
  7. </resources> 

说明:上面自定义属性文件中

OkCancelBar就是定义在<declare-styleable name="OkCancelBar"></declare-styleable> 里的 名字,获取里面属性用 名字_ 属性 连接起来就可以.TypedArray 通常最后调用 .recycle() 方法,为了保持以后使用该属性一致性!

接下来创建OkCancelBar类继承LinearLayout

 


   
   
  1. package com.xzw.merge; 
  2.   
  3. import android.content.Context; 
  4. import android.content.res.TypedArray; 
  5. import android.util.AttributeSet; 
  6. import android.view.Gravity; 
  7. import android.view.LayoutInflater; 
  8. import android.widget.Button; 
  9. import android.widget.LinearLayout; 
  10.  
  11. public class OkCancelBar  extends LinearLayout{ 
  12.     public OkCancelBar(Context context,AttributeSet attrs) { 
  13.          super(context,attrs); 
  14.          setOrientation(HORIZONTAL); //横排 
  15.          setGravity(Gravity.CENTER); //居中显示 
  16.          setWeightSum(1.0f); 
  17.           
  18.          LayoutInflater.from(context).inflate(R.layout.okcancelbar, this,true); 
  19.         //TypedArray是一个数组容器   
  20.          TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.OkCancelBar, 00); 
  21.              
  22.             String text = array.getString(R.styleable.OkCancelBar_okLabel);//这里的属性是:名字_属性名   
  23.             if (text == null) text = "Ok"
  24.             ((Button) findViewById(R.id.okcancelbar_ok)).setText(text); 
  25.              
  26.             text = array.getString(R.styleable.OkCancelBar_cancelLabel); 
  27.             if (text == null) text = "Cancel"
  28.             ((Button) findViewById(R.id.okcancelbar_cancel)).setText(text); 
  29.              
  30.             array.recycle(); 
  31.     } 
  32.      

 

 

创建布局文件:

 


   
   
  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  
  3. <merge 
  4.     xmlns:android="http://schemas.android.com/apk/res/android" 
  5.     xmlns:okCancelBar="http://schemas.android.com/apk/res/com.xzw.merge"> 
  6.  
  7.     <ImageView   
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent"  
  10.      
  11.         android:scaleType="center" 
  12.         android:src="@drawable/golden_gate" /> 
  13.      
  14.     <com.xzw.merge.OkCancelBar 
  15.         android:layout_width="fill_parent"  
  16.         android:layout_height="wrap_content"  
  17.         android:layout_gravity="bottom" 
  18.         android:paddingTop="8dip" 
  19.         android:gravity="center_horizontal" 
  20.         android:background="#AA000000" 
  21.         okCancelBar:okLabel="Save" 
  22.         okCancelBar:cancelLabel="Don't save" /> 
  23.  
  24. </merge> 

说明:
xmlns:okCancelBar:是我们自定义属性的命名空间前缀。也就是下面

  1.  okCancelBar:okLabel="Save" 
  2.  okCancelBar:cancelLabel="Don't save"

用到的。

”http://schemas.android.com/apk/res/com.xzw.merge" 其中com.xzw.merge 是类文件所在包名。

使用自定义属性必须加上该命名空间。

 

 

看下效果图:

上面就是完整的实例。下面附上代码。

能力有限请大家多多指教。



本文转自xuzw13 51CTO博客,原文链接:http://blog.51cto.com/xuzhiwei/1040484,如需转载请自行联系原作者

 

相关文章
|
3月前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
4月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
70 1
|
4月前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
4月前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
75 5
|
5月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
172 0
|
5月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
5月前
|
XML 存储 数据格式
|
5月前
|
Android开发 开发者
安卓应用开发中的自定义视图
【9月更文挑战第37天】在安卓开发的海洋中,自定义视图犹如一座座小岛,等待着勇敢的探索者去发现其独特之处。本文将带领你踏上这段旅程,从浅滩走向深海,逐步揭开自定义视图的神秘面纱。
61 3
|
6月前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
92 10
|
6月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
84 3

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 8
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 9
    Android实战经验之Kotlin中快速实现MVI架构
  • 10
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
  • 1
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
    66
  • 2
    android FragmentManager 删除所有Fragment 重建
    25
  • 3
    Android实战经验之Kotlin中快速实现MVI架构
    42
  • 4
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    42
  • 5
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    46
  • 6
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    161
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    55
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    73
  • 9
    Android历史版本与APK文件结构
    183
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    54