不好意思...时隔一年才更新...
该博客由于篇幅较长,分为1,2两篇,这篇主要介绍在Android中经常使用到的xml是什么以及在Android布局中的应用。下一篇博客将介绍Android的UI布局方式。
用xml描述事物
在详细介绍xml之前,我们先来看看,我们是怎么描述一种事物的。这里假设我们要描述一本书,可能会做出一下陈述:
这是一本白色封面,标题是《平凡的世界》,作者是路遥,还挺厚的书,呃,多少页呢,让我看看,哦,300页。
这是在自然不过的描述了,因为你的描述对象是跟你一样的正常人,他很自然的就用他的心智理解了你的描述对象。但是,如果我们要描述给机器(程序)听呢?这就需要我们提供一种统一格式的描述语言,好让机器也能通过一段对应的程序来轻易解析出我们要传达的内容。其中一种描述语言,就是xml。下面我们用xml的方式来重新描述一下。
<Book>
<title>平凡的世界</title>
<cover_color>白色</cover_color>
<author>路遥</author>
<page_amount>300</page_amount>
</Book>
我们来总结一下xml的基本格式:
- xml中描述的对象称为
元素
- 所有元素以<>开始,以</>结束
- 元素可以包含子元素或者描述信息。(实际上子元素也属于描述信息)
现在我们来换一种等价的描述方式
<Book
title = "平凡的世界"
cover_color = "白色"
author = "路遥"
page_amount = "300"
>
</Book>
对于不包含子元素或描述内容的元素,可以简写成:
<Book
title = "平凡的世界"
cover_color = "白色"
author = "路遥"
page_amount = "300"
/>
这里我把原来属于Book的子元素挪到了尖括号<>内,Book这个元素就没有子元素了。再来总结一下。
- xml中<>内的描述项称为属性。
- 属性的格式是
attr = "description"
既然这两种方式都可以做到同样的描述,那么用子元素来描述元素和用属性来描述又什么区别呢?有一个很关键的地方是:在xml中,元素是可以包含元素的,也就是说元素下面还可以包含子元素,而属性只能单独存在,不可扩展。在官方文档中有这么一段描述:
415F55D3-5CED-431C-ADB7-33A038227381.png为了可以实现自由的扩展,我们应该尽量使用子元素来描述元素。
Android中的xml
上面说到,要尽量用子元素来描述父元素,那么属性有什么用呢?在Android中,却是经常使用属性而不是子元素来描述父元素。比如在Android的布局文件中,我们经常看到一个Button是这样被描述的。
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button" />
注:这里的wrap_content
是指宽度/高度是适应内容的。
Android正是采用了这种不被推荐的形式,这是为什么呢?
我们知道,layout中的xml文件是被用来描述布局的。为了实现一个界面的布局,Android使用了View和ViewGroup来构成整个界面的布局。View很好理解,翻译成中文,就是一个个控件,比如Button(按钮),TextView(文本框),ImageView(图片框)。而ViewGroup,翻译成中文,控件组,也就是说,它是用来放一组控件的。我们通过一个示意图来描述它们的关系。
ViewGroup可以包含ViewGroup和View,这样各种控件就可以被合理的组织渲染到屏幕上了。ViewGroup和View之间实际上就构成了xml中的父元素和子元素的关系。一个布局的顶级元素必定是ViewGroup,它底下包含View和ViewGroup子元素。如果用来描述一个View的内容以子元素呈现的话,就会破坏这种继承结构。因而,Android采用了属性来描述ViewGroup和View,Android中的元素只有两种,要么是ViewGroup,要么是View,它们两个以如上图的方式正确组织着,才能正确地渲染出界面。
这就是Android布局中应用xml时反设计的原因,下一篇博客将介绍Android的UI布局方式。
Happy Coding!
网友评论