XML用于保存数据值的语言。
XML它类似于标记语言HTML——假如以前接触过Web开发的话。XML文件使用树结构作为数据模型。一般来说,一个布局文件有一个布局元素,并将其作为一个特定的布局模型——包含UI子元素包括按钮、图片和文本。
基础知识
语法
在XML数据值保存在元素中。单个元素通常包含开始标记和结束标记。
<product>Onion</product> <!-- 数据值是元素内容,文本字符串Onion” -->
开始标记还可以容纳与数据项目相关的其他属性信息。每个属性都有一个名称和一个值,其中值是引号的一部分。
<product type="vegetable">Onion</product>
其它元素也可以包含在元素中,例如:
<section name="food"> <product type="vegetable">Onion</product> <product type="fruit">Banana</product> </section> <!-- 我们将section元素称为主要元素,products元素被称为子元素。两个子元素属于兄弟关系。-->
在XML文档中必须有一个root元素作为主要元素,或被称为嵌套。这构成了一种tree结构(如本文开头所述),子元素作为自主元素延伸的分支。如果其他子元素也包含在一个子元素下,它也具有主要元素属性。
自结束元素,其中开始与结束标记并非独立存在,例:
<order number="12345" customerID="a4d45s"/>
单位
- dp(dip): device independent pixels(设备独立像素)。 不同的设备有不同的显示效果,支持WVGA、HVGA和QVGA 。
- px: pixels(像素). 不同的设备有相同的显示效果,通常我们HVGA代表320x480像素,这个用的比较多。
- pt: point,是标准长度单位,1pt=1/72英寸,用于印刷业,非常简单易用。
- sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
布局
<RelativeLayout 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" tools:context=".MainActivity">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" />
</RelativeLayout>
布局元素
LinearLayout(线性布局)
LinearLayout会沿横向或者纵向显示我们打算使用的View。
android:orientation
属性为线性布局指定方式,组件的排列方向是水平(horizontal)还是竖直(vertical),默认为竖直。若垂直方向显示,则每个View都会沿屏幕下方依次排列;如果采取横向布局,那么各个View将由左至右依次排列。
android:divider
属性为线性布局设置分割线图片,通过android:showDividers
属性来设置分割线的所在位置,有四个可选值none(无), middle(每两个组件间), begining(开始), end(结束),还可以通过dividerPadding
设置分割线的padding(填充)。 演示代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@drawable/ktv_line_div" android:orientation="vertical" android:showDividers="middle" android:dividerPadding="10dp" tools:context="com.jay.example.linearlayoutdemo.MainActivity" >
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按钮1" />
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按钮2" />
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按钮3" />
</LinearLayout>
RelativeLayout(相对布局)
ignoreGravity
属性:设置了该属性为true的属性的组件,将不受gravity属性的影响。
语法为:对应对齐方式='true'
-
根据父容器定位
android:layout_alignParentLeft
:左对齐android:layout_alignParentRight
:右对齐android:layout_alignParentTop
:顶部对齐android:layout_alignParentBottom
:底部对齐android:layout_centerHorizontal
:水平居中android:layout_centerVertical
:垂直居中android:layout_centerInParent
:中间位置 -
根据兄弟组件定位
android:layout_toLeftOf
:参考组件的左边android:layout_toRightOf
:参考组件的右边android:layout_above
:参考组件的上方android:layout_below
:参考组件的下方android:layout_alignTop
:对齐参考组件的上边界android:layout_alignBottom
:对齐参考组件的下边界android:layout_alignLeft
:对齐参考组件的左边界android:layout_alignRight
:对齐参考组件的右边界
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/RelativeLayout1" android:layout_width="match_parent" android:layout_height="match_parent" >
<!-- 这个是在容器中央的 -->
<ImageView android:id="@+id/img1" android:layout_width="80dp" android:layout_height="80dp" android:layout_centerInParent="true" android:src="@drawable/pic1"/>
<!-- 在中间图片的左边 -->
<ImageView android:id="@+id/img2" android:layout_width="80dp" android:layout_height="80dp" android:layout_toLeftOf="@id/img1" android:layout_centerVertical="true" android:src="@drawable/pic2"/>
<!-- 在中间图片的右边 -->
<ImageView android:id="@+id/img3" android:layout_width="80dp" android:layout_height="80dp" android:layout_toRightOf="@id/img1" android:layout_centerVertical="true" android:src="@drawable/pic3"/>
<!-- 在中间图片的上面-->
<ImageView android:id="@+id/img4" android:layout_width="80dp" android:layout_height="80dp" android:layout_above="@id/img1" android:layout_centerHorizontal="true" android:src="@drawable/pic4"/>
<!-- 在中间图片的下面 -->
<ImageView android:id="@+id/img5" android:layout_width="80dp" android:layout_height="80dp" android:layout_below="@id/img1" android:layout_centerHorizontal="true" android:src="@drawable/pic5"/>
</RelativeLayout>
- 设置margin偏移(即组件和父容器的边距)
layout_margin
:设置组件上下左右的偏移量layout_marginLeft
:设置组件离左边的偏移量layout_marginRight
:设置组件离右边的偏移量layout_marginTop
:设置组件离上面的偏移量layout_marginBottom
:设置组件离下面的偏移量
:设置组件内部元素间的边距(如Textview里的字体位置)
android:padding
:往内部元素的上下左右填充一定边距android:paddingLeft
:往内部元素的左边填充一定边距android:paddingRight
:往内部元素的右边填充一定边距android:paddingTop
:往内部元素的上方填充一定边距android:paddingBottom
:往内部元素的下方填充一定边距
TableLayout(表格布局)
一个组件沾满一行,也可以通过添加TableRow容器,将几个组件放在一行(构成几列),TableRow中组件的个数决定了该行有多少列,而列的宽度由该列中最宽的单元格决定。
TableRow的layout_width属性是fill_parent固定不变,layout_height默认是wrap_content且可以自定义大小。
android:collapseColumns
:设置需要被隐藏的列的序号。android:stretchColumns
:设置允许被收缩的列的列序号。收缩到适应父容器宽度的程度。android:shrinkColumns
:设置允许被拉伸的列的列序号。拉伸到填满整行的程度。 以上这三个属性的列号都是从0开始算的;可以设置多个,用逗号隔开;如果所有列都生效则用"*"号即可。android:layout_column
:表示跳过第x个,直接显示到第x+1个格子处。注意:从1开始算起。android:layout_span
:表示合并x个单元格,即这个组件占x个单元格。
FrameLayout(帧布局)
FrameLayout(帧布局)直接在屏幕上开辟出一块空白的区域,当我们往里面添加控件的时候会默认把他们放到这块区域的左上角。帧布局的大小由控件中最大的子控件决定,如果控件的大小一样大的话,那么同一时刻就只能看到最上面的那个组件,即后续添加的控件会覆盖前一个。
永远处于帧布局最上面,不会被覆盖。
android:foreground
:设置改帧布局容器的前景图。android:foregroundGravity
:设置前景图像显示的位置。例如值为right|bottom设置在右下角。
AbsoluteLayout(绝对布局)
通过X,Y坐标来控制组件在Activity中的位置。。
除了通用属性width和height外,还有两个控制位置的属性:
android:layout_x
属性:设置组件的X坐标。android:layout_y
属性:设置组件的Y坐标。
GridLayout(网格布局)
Android4.0后引入的,最小sdk版本要在14及以上。低版本sdk需要导入v7包的gridlayout包(v7包一般在sdk下的:sdk\extras\android\support\v7\gridlayout目录下)。使用时添加标签:<android.support.v7.widget.GridLayout>
。此处暂时不过多赘述。
可以自己设置布局中组件的排列方式;自定义网格布局有多少行,多少列;直接设置组件位于某行某列;设置组件横跨几行或者几列。
android:orientation
属性:设置排列方式。默认为vertical(竖直),或者设置为水平(horizontal)。android:layout_gravity
属性:设置对齐方式,如center,left,right,bottom等,若想同时使用两种如“bottom|left”android:rowCount
属性:设置行数。android:columnCount
属性:设置列数。android:layout_row
属性:设置组件所在的行(从0开始)。不设置默认每个组件占一个单元格。android:layout_column
属性:设置组件所在的列(从0开始)。不设置默认每个组件占一个单元格。android:layout_rowSpan
属性:设置组件横跨几行。android:layout_columnSpan
属性:设置组件横跨几列。如果需要组件填满横跨的几行或几列,需要给该组件添加属性使android:layout_gravity = "fill"
。
xml命名空间
在布局文件中,xmlns:android="http://schemas.android.com/apk/res/android"
和 xmlns:tools="http://schemas.android.com/tools"
用于在xml命名空间中定义我们所需要使用的架构。有了它就可以按 “alt + / ”作为语法提示。
tools:context
设置对应的渲染上下文主题。
布局通用属性
gravity
属性: 控制组件所包含的子元素的对齐方式。可多个组合如(left|buttom)。若以center_horizontal
作为gravity值,其中包含的元素就会以X轴为中心加以显示。layout_gravity
属性:控制该组件在父容器里的对齐方式。layout_width
属性: 若值为fill_parent
或match_parent
,布局会被拉伸至横向的最大长度;wrap_content
使View的宽度足以容纳其显示内容。layout_height
属性: 若值为fill_parent
或match_parent
,布局会被拉伸至纵向的最大长度;wrap_content
使View的高度足以容纳其显示内容。layout_margin
属性:边距属性,使用“dp”为数值单位来设置像素的独立密度。id
属性:例如android:id="@+id/LinearLayout1"
为这个布局设置一个id值标记为LinearLayout1,并添加到R文件的id内部类中。background
属性:为该组件设置一个背景图片,或者直接用颜色覆盖。layout_weight
属性:设置该布局权重,等比例地划分区域。若要按比例划分水平方向,需要将涉及到的view的width属性设置为0dp,然后设置weight的值;若要按比例划分竖直方向,需要将涉及到的view的height属性设置为0dp,然后设置weight的值。或者设置为wrap_content,但不要设置成fill_parent,因为它的计算规则和你想要的结果不一样。
view
View是绘制在屏幕上的用户能与之交互的一个对象。View属于可见及交互性元素,用以构成我们的应用程序UI。
在Android系统中,这些布局被称为ViewGroup对象,每个 ViewGroup内包含一套或者多套View。ViewGroup是一个用于存放其他View(和ViewGroup)对象的布局容器。
如果使用java代码自定义了一个组件,需要在布局文件中添加以下代码:
<com.作者.包名.类名 android:layout_width="match_parent" android:layout_height="match_parent"/>
分割线
可以通过直接在布局中添加一个view显示一条分割线。(该例子便于我们了解view的具体用法)如下代码将会显示一条水平方向的黑线。
<View android:layout_width="match_parent" android:layout_height="1px" android:background="#000000" />
通用属性
组件可以使用所在布局中的属性,除了上述提到的布局通用属性外,view还有一些常用属性:
android:layout_gravity
属性:值可以为fill。android:layout_marginLeft
属性:左边距。android:layout_marginRight
属性:右边距。
TextView元素
布局元素当中的TextView允许开发人员显示一条文本字符串。TextView是View的一种。
注意:TextView是很多其他控件的父类(如Button),这些控件均可以使用TextView的属性。
android:text
属性:通过列举文本字符串实现显示功能。将每一个文本字符串值保存为一项值资源,使用@string资源调用。语法为:@string/字符串名称
,通过在字符串名称前加上@string的方式告知Android工具需要在哪里寻找字符串资源。android:textSize
属性:设置文本大小。单位为sp。android:textColor
属性:文本颜色。一般通过colors.xml资源来引用。android:textStyle
属性:可以设置normal(无效果)、bold(加粗)、italic(斜体),若多选用" | "分隔。android:textScaleX
属性:设置字间距,控制字体水平方向的缩放,默认值1.0f,值是float。android:lineSpacingExtra
属性:设置行间距,如"3dp"。android:lineSpacingMultiplier
属性:设置行间距的倍数,如"1.2"。
android:shadowColor
属性、android:shadowRadius
属性搭配使用:前者设置阴影颜色,后者设置阴影的模糊程度(0.1为字体颜色,建议使用3.0)。android:shadowDx
属性:设置阴影在水平方向的偏移,就是水平方向阴影开始的横坐标位置。android:shadowDy
属性:设置阴影在竖直方向的偏移,就是竖直方向阴影开始的纵坐标位置。
设置边框需要编写一个shapeDrawable资源文件放置在drawable文件夹中(文件名只能由小写英文字母和阿拉伯数字组成),然后将TextView的background设置为这个资源,值为"@drawable/shape文件名"
。
shapeDrawable文件编写格式如下: 注意不要直接复制别人的代码,里面的空格会报错,最好自己往上敲。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 在此处添加元素,常用元素在下方列出 -->
<!-- 设置背景颜色 -->
<solid android:color = "#000000"/>
<!-- 设置边框的粗细、边框颜色 -->
<stroke android:width = "2dp" android:color="#111111"/>
<!-- 设置边距(top、bottom、left、right) -->
<padding android:bottom = "5dp"/>
<!-- 设置四个圆角的半径-->
<corners android:topLeftRadius="10px" android:topLeftRadius="10px" android:bottomLeftRadius="10px" android:bottomRightRadius="10px"/>
<!-- 设置渐变色 startColor属性:起始颜色。 endColor属性:结束颜色。 centerColor属性:中间颜色。 angle属性:方向角度。angle= 0 度时从左到右逆时针方向转;当angle = 90度时从下往上。 type属性:设置渐变的类型 -->
<gradient></gradient>
</shape>
利用四个属性分别给TextView的四个位置添加图片:drawableTop
(上),drawableButtom
(下),drawableLeft
(左),drawableRight
(右)。
使用drawablePadding
属性设置图片与文字间的间距。
使用android:autoLink
属性后,程序自动识别对应类型,在用户界面可以通过点击文本跳转到对应目的程序中。autoLink的值可以为web、email、phone等,all表示各种类型全部包含(自动识别协议头)。
需要将以下代码组合使用:
android:singleLine="true"
设置是否自动换行,默认为需要自动换行(false),设置为 true 表示不需要自动换行。注意:若要设置多行显示不完,可添加maxLines
属性。android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
EditText输入框
android:hint="默认提示文本"
,设置提示的文本内容。android:textColorHint="#95A1AA"
,设置提示文本的颜色。
android:inputType
属性可以对输入的数据进行限制。可选参数如下:
android:inputType="none" android:inputType="text" android:inputType="textCapCharacters" android:inputType="textCapWords" android:inputType="textCapSentences" android:inputType="textAutoCorrect" android:inputType="textAutoComplete" android:inputType="textMultiLine" android:inputType="textImeMultiLine" android:inputType="textNoSuggestions" android:inputType="textUri" android:inputType="textEmailAddress" android:inputType="textEmailSubject" android:inputType="textShortMessage" android:inputType="textLongMessage" android:inputType="textPersonName" android:inputType="textPostalAddress" android:inputType="textPassword" android:inputType="textVisiblePassword" android:inputType="textWebEditText" android:inputType="textFilter" android:inputType="textPhonetic" android:inputType="number" android:inputType="numberSigned" android:inputType="numberDecimal" android:inputType="phone"//拨号
键盘 android:inputType="datetime" android:inputType="date"//日期键盘 android:inputType="time"//时间键盘
默认多行显示的,自动换行。
android:minLines="3"
,设置最小行的行数。android:maxLines="3"
,设置最大的行数。当输入内容超过maxline,文字会自动向上滚动。android:singleLine="true"
,设置单行输入,而且不会滚动。android:textScaleX="1.5"
,设置字与字的水平间隔。android:textScaleY="1.5"
,设置字与字的垂直间隔
android:windowSoftInputMode
属性设置Activity主窗口与软键盘的交互模式(需要与java文件中焦点获取方法配合使用)。该属性控制两个方面的内容:(1)当有焦点产生时,软键盘是隐藏还是显示;(2)是否减少活动主窗口大小以便腾出空间放软键盘。
可选值如下,多选时用"|"分开:
stateUnspecified
:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置。stateUnchanged
:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示。stateHidden
:用户选择activity时,软键盘总是被隐藏。stateAlwaysHidden
:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的。stateVisible
:软键盘通常是可见的。stateAlwaysVisible
:用户选择activity时,软键盘总是显示的状态。adjustUnspecified
:默认设置,通常由系统自行决定是隐藏还是显示。adjustResize
:该Activity总是调整屏幕的大小以便留出软键盘的空间。adjustPan
:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。
android:selectAllOnFocus="true"
,表示点击输入框获得焦点后,全选输入框中所有的文本内容。android:capitalize
属性设置英文字母大写类型,默认为none。三个可选值:sentences
:仅第一个字母大写;words
:每一个单词首字母大小,用空格区分单词;characters
:每一个英文字母都大写。- 与TextView类似,使用margin相关属性增加组件相对其他控件的距离,比如
android:marginTop = "5dp"
,使用padding增加组件内文字和组件边框的距离,比如android:paddingTop = "5dp"
。
Button元素
前面已经提到过,Button是继承了TextView的,我们强调:
- 按钮上显示的是
android:text
属性值。 android:id
属性用于识别每一个独特的view。语法为:android:id="@+id/按钮ID名"
。“@+id”语法会提示Android工具在项目资源“R.java”文件中创建一个新ID,并为其指定一个在应用程序内独一无二的文本字符串。
通过编写资源文件罗列不同状态下组件如何绘画,在java文件中设置动作监听者,将Button的background属性设置为该drawable资源即可实现背景色/背景图片的变化。如:
StateListDrawable的关键节点 是< selector >
,其属性如下:
drawable
:引用的Drawable位图,可以把他放到最前面,就表示组件的正常状态。state_focused
:是否获得焦点。state_window_focused
:是否获得窗口焦点。state_enabled
:控件是否可用。state_checkable
:控件可否被勾选,例如checkbox
。state_checked
:控件是否被勾选。state_selected
:控件是否被选择,针对有滚轮的情况。state_pressed
:控件是否被按下。state_active
:控件是否处于活动状态,例如slidingTab
。state_single
:控件包含多个子控件时,确定是否只显示一个子控件。state_first
:控件包含多个子控件时,确定第一个子控件是否处于显示状态。state_middle
:控件包含多个子控件时,确定中间一个子控件是否处于显示状态。state_last
:控件包含多个子控件时,确定最后一个子控件是否处于显示状态。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/ic_course_bg_fen"/>
<item android:state_enabled="false" android:drawable="@drawable/ic_course_bg_pressed"/>
<item android:drawable="@drawable/ic_course_bg_cheng"/>
</selector>
其语法结构可理解为,当组件处于某种状态时,以某种drawable形式展现,无状态条件时其drawable即为默认drawable。
按钮外观的设置和TextView类似,通过编写ShapeDrawable资源文件实现,其标签为<shape />
。若需要根据状态动态变化,可将shape标签嵌入到item标签中。
注意:我们说ShapeDrawable,指的是该文件的类型,不代表两种不同类型的代码必须分开写,它们的命名也不要求区分。
ImageView图像视图
用来显示图像的一个View或者控件。常用属性如下:
android:src
属性:设置图片,强调组件内容,按照图片大小直接填充,并不会进行拉伸。android:background
属性:设置图片,强调组件背景,会根据ImageView给定的宽度来进行拉伸图片。setAlpha
属性:为src设置透明度。adjustViewBounds
属性、android:maxHeight
属性、android:maxWidth
属性配合使用,用于设置缩放时是否保持原图长宽比, 单独设置不起作用。 用法:将adjustViewBounds
的值设置为true,android:maxHeight
表示设置ImageView的最大高度,android:maxWidth
表示设置ImageView的最大宽度。scaleType
属性:设置显示的图片如何缩放或者移动以适应ImageView的大小。可选值如下:fitXY
:对图像的横向与纵向进行独立缩放,使得该图片完全适应ImageView,但是图片的横纵比可能会发生改变。fitStart
:保持纵横比缩放图片,尽可能大地填充view,缩放完成后将图片放在ImageView的左上角。fitCenter
:同上,缩放后放于中间。fitEnd
:同上,缩放后放于右下角。center
:保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size,超过部分裁剪处理。centerCrop
:保持横纵比缩放图片,完全覆盖ImageView,可能会出现图片的显示不完全。centerInside
:保持横纵比缩放图片,直到ImageView能够完全地显示图片。matrix
:默认值,不改变原图的大小,从ImageView的左上角开始绘制原图, 原图超过ImageView的部分作裁剪处理。
已知background会拉伸图片,可以通过编写drawable的Bitmap资源文件,将然后background属性设置为该文件即可。 titleMode
属性是平铺,设置disabled
表示禁止平铺。
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:id="@id/pen_bg" android:gravity="top" android:src="@drawable/pen" android:tileMode="disabled" >
</bitmap>
RadioButton单选按钮
通过把RadioButton放到RadioGroup按钮组中,实现单选功能。可以先为外层RadioGroup组件设置外观属性。 举个简单的例子:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content 标签:
传感器翻转插座