不好意思...時隔一年才更新...
該博客由于篇幅較長,分為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中,元素是可以包含元素的,也就是說元素下面還可以包含子元素,而屬性只能單獨存在,不可擴展。在官方文檔中有這么一段描述:
為了可以實現自由的擴展,我們應該盡量使用子元素來描述元素。
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!