
文本显示
设置文本内容
在 XML 文件中通过属性 android:text 设置文本,在XML文件中引用(@string/xxx)
- ```xml
1
2
3
4
5
6
7
8
- 在 Java 代码中调用文本视图对象的 setText 方法设置文本
引用字符串资源,在Java代码中引用(R.string.xxx)
- ```java
// 获取名为tv_hello的文本视图
TextView tv_hello = findViewById(R.id.tv_hello);
tv_hello.setText("你好,世界"); // 设置tv_hello的文字内容
- ```xml
设置文本的大小
TextView允许设置文本内容,也允许设置文本大小,在Java代码中调用setTextSize方法,即可指定文本大小
1 | // 从布局文件中获取名叫tv_sp的文本视图 |
XML文件要求在字号数字后面写明单位类型,常见的字号单位主要有px、dp、sp 3种,分别介绍如下。
px
px是手机屏幕的最小显示单位,它与设备的显示屏有关。一般来说,同样尺寸的屏幕(比如6英寸手机),如果看起来越清晰,则表示像素密度越高,以px计量的分辨率也越大。
dp
dp有时也写作dip,指的是与设备无关的显示单位,它只与屏幕的尺寸有关。一般来说,同样尺寸的屏幕以dp计量的分辨率是相同的,比如同样是6英寸手机,无论它由哪个厂家生产,其分辨率换算成dp单位都是一个大小。
sp(推荐)
sp的原理跟dp差不多,但它专门用来设置字体大小。手机在系统设置里可以调整字体的大小(小、标准、大、超大)。设置普通字体时,同数值dp和sp的文字看起来一样大;如果设置为大字体,用dp设置的文字没有变化,用sp设置的文字就变大了。
字体大小采用不同单位的话,显示的文字大小各不相同。例如,30px、30dp、30sp这3个字号,在不同手机上的显示大小有所差异。有的手机像素密度较低,一个dp相当于两个px,此时30px等同于15dp;
有的手机像素密度较高,一个dp相当于3个px,此时30px等同于10dp。假设某个App的内部文本使用字号30px,则该App安装到前一部手机的字体大小为15dp,安装到后一部手机的字体大小为10dp,显然后一部手机显示的文本会更小。
名称 | 解释 |
---|---|
px(Pixel像 素) | 也称为图像元素,是作为图像构成的基本单元,单个像素的大小并不固定,跟随 屏幕大小和像素数量的关系变化,一个像素点为1px。 |
Resolution (分辨率) | 是指屏幕的垂直和水平方向的像素数量,如果分辨率是 1920*1080 ,那就是垂 直方向有 1920 个像素,水平方向有 1080 个像素。 |
Dpi(像素密 度) | 是指屏幕上每英寸(1英寸 = 2.54 厘米)距离中有多少个像素点。 |
Density(密 度) | 是指屏幕上每平方英寸(2.54 ^ 2 平方厘米)中含有的像素点数量。 |
Dip / dp (设 备独立像素) | 也可以叫做dp,长度单位,同一个单位在不同的设备上有不同的显示效果,具体 效果根据设备的密度有关,详细的公式请看下面 。 |
设置文本的颜色
1 | // 从布局文件中获取名为tv_code_system的文本视图 |
注意属性android:background和setBackgroundResource方法,它俩用来设置控件的背景,不单单是背景颜色,还包括背景图片。
视图基础
设置视图的宽高
手机屏幕是块长方形区域,较短的那条边叫作宽,较长的那条边叫作高。App控件通常也是长方形状,控件宽度通过属性android:layout_width表达,控件高度通过属性android:layout_height表达,宽高的取值主要有下列3种:
match_parent
:表示与上级视图保持一致。上级视图的尺寸有多大,当前视图的尺寸就有多大。wrap_content
:表示与内容自适应。对于文本视图来说,内部文字需要多大的显示空间,当前视图就要占据多大的尺寸。但最宽不能超过上级视图的宽度,一旦超过就要换行;最高不能超过上级视图
的高度,一旦超过就会隐藏。- 以
dp
为单位的具体尺寸,比如300dp,表示宽度或者高度就是这么大。
设置视图的间距
每个TextView标签都携带新的属性android:layout_marginTop="5dp"
,该属性的作用是让当前视图与上方间隔一段距离。同理,android:layout_marginLeft
让当前视图与左边间隔一段距离,android:layout_marginRight
让当前视图与右边间隔一段距离,android:layout_marginBottom
让当前视图与下方间隔一段距离。如果上下左右都间隔同样的距离,还能使用android:layout_margin
一次性设置四周的间距。
1 | <!-- 最外层的布局背景为蓝色 --> |

设置视图的对齐方式
在XML文件中通过属性android:layout_gravity
可以指定当前视图的对齐方向,当属性值为top时表示视图朝上对齐,为bottom时表示视图朝下对齐,为left时表示视图靠左对齐,为right时表示视图靠右对齐。如果希望视图既朝上又靠左,则用竖线连接top与left,此时属性标记为android:layout_gravity="top|left"
;如果希望视图既朝下又靠右,则用竖线连接bottom与right,此时属性标记为android:layout_gravity="bottom|right"
。
注意layout_gravity
规定的对齐方式,指的是当前视图往上级视图的哪个方向对齐,并非当前视图的内部对齐。若想设置内部视图的对齐方向,则需由当前视图的android:gravity
指定,该属性一样拥有top、bottom、left、right 4种取值及其组合。
gravity
与layout_gravity
的不同之处在于:layout_gravity设定了当前视图相对于上级视图的对齐方式,而gravity设定了下级视图相对于当前视图的对齐方式;前者决定了当前视图的位置,而后者决定了下级视图的位置。
常用布局
线性布局LinearLayout
线性布局像是用一根线把它的内部视图串起来,故而内部视图之间的排列顺序是固定的,要么从左到右排列,要么从上到下排列。
在XML文件中,LinearLayout通过属性android:orientation
区分两种方向,其中从左到右排列叫作水平方向,属性值为horizontal;从上到下排列叫作垂直方向,属性值为vertical。
如果LinearLayout标签不指定具体方向,则系统默认该布局为水平方向排列,也就是默认android:orientation="horizontal"
除了方向之外,线性布局还有一个权重概念,所谓权重,指的是线性布局的下级视图各自拥有多大比例的宽高,在XML文件中通过属性android:layout_weight
来表达。
一旦设置了layout_weight
属性值,便要求layout_width
填0dp或者layout_height
填0dp。如果layout_width
填0dp,则layout_weigh
t表示水平方向的权重,下级视图会从左往右分割线性布局;如果layout_height
填0dp,则layout_weight
表示垂直方向的权重,下级视图会从上往下分割线性布局。
1 |
|

相对布局RelativeLayout
线性布局的下级视图是顺序排列着的,另一种相对布局的下级视图位置则由其他视图决定。相对布局名为RelativeLayout,因为下级视图的位置是相对位置,所以得有具体的参照物才能确定最终位置。
如果不设定下级视图的参照物,那么下级视图默认显示在RelativeLayout内部的左上角。用于确定下级视图位置的参照物分两种,一种是与该视图自身平级的视图;另一种是该视图的上级视图。
- 属性值为true或者false
- android:layout_centerHrizontal 水平居中
- android:layout_centerVertical 垂直居中
- android:layout_centerInparent 相对于父控件完全居中
- android:layout_alignParentBottom 贴紧父控件的下边缘
- android:layout_alignParentLeft 贴紧父控件的左边缘
- android:layout_alignParentRight 贴紧父控件的右边缘
- android:layout_alignParentTop 贴紧父控件的上边缘
- android:layout_alignWithParentIfMissing 如果对应的兄弟控件找不到的话,就以父控件作为参照物
- 属性值必须为id的引用名“@id/id-name”
- android:layout_below 在某控件下方
- android:layout_above 在某控件上方
- android:layout_toLeftOf 在某控件的左边
- android:layout_toRightOf 在某控件的右边
- android:layout_alignTop 本控件的上边缘和某控件的上边缘对齐
- android:layout_alignLeft 本控件的左边缘和某控件的左边缘对齐
- android:layout_alignBottom 本控件的下边缘和某控件的下控件对齐
- android:layout_alignRight 本控件的右边缘和某控件的有边缘对齐
- 属性值为具体的像素值,如30dip,40px
- android:layout_marginBottom 离某控件底边缘的距离
- android:layout_marginLeft 离某控件左边缘的距离
- android:layout_marginRight 离某控件右边缘的距离
- android:layout_marginTop 离某控件上边缘的距离
网格布局GridLayout
网格布局默认从左往右、从上到下排列,它先从第一行从左往右放置下级视图,塞满之后另起一行放置其余的下级视图,如此循环往复直至所有下级视图都放置完毕。
为了判断能够容纳几行几列,网格布局新增了android:columnCount
与android:rowCount
两个属性,其中columnCount
指定了网格的列数,即每行能放多少个视图;rowCount
指定了网格的行数,即每列能放多少个视图。
1 |
|
滚动视图ScrollView
与线性布局类似,滚动视图也分为垂直方向和水平方向两类,其中垂直滚动视图名为ScrollView
,水平滚动视图名为HorizontalScrollView
。这两个滚动视图的使用并不复杂,主要注意以下3点:
- 垂直方向滚动时,
layout_width
属性值设置为match_parent
,layout_height
属性值设置为wrap_content
。 - 水平方向滚动时,
layout_width
属性值设置为wrap_content
,layout_height
属性值设置为match_parent
。 - 滚动视图节点下面必须且只能挂着一个子布局节点,否则会在运行时报错
Caused by: java.lang.IllegalStateException:ScrollView can host only one direct child
。
有时ScrollView
的实际内容不够,又想让它充满屏幕,再增加一行android:fillViewport
(该属性为true表示允许填满视图窗口
1 | android:layout_height="match_parent" |
按钮
Button继承于TextView,因此它们拥有的属性都是共通的。
textAllCaps
对于TextView来说,text属性设置了什么文本,文本视图就显示什么文本。但对于Button来说,不管text属性设置的是大写字母还是小写字母,按钮控件都默认转成大写字母显示。比如在XML文件中加入下面的Button标签
1 | <Button |
编译运行后的App界面,按钮上显示全大写的“HELLO WORLD”,而非原来大小写混合的“Hello
World”。显然这个效果不符合预期,为此需要给Button标签补充textAllCaps属性,该属性默认为true表示全部转为大写,如果设置为false则表示不转为大写。
1 | <Button |
点击事件
除此之外,Button最重要的是点击事件。
点击监听器:通过
setOnClickListener
方法设置。按钮被按住少于500毫秒时,会触发点击事件。- ```java
// 从布局文件中获取名为btn_click_single的按钮控件
Button btn_click_single = findViewById(R.id.btn_click_single);
// 给btn_click_single设置点击监听器,一旦用户点击按钮,就触发监听器的onClick方法
btn_click_single.setOnClickListener(new MyOnClickListener());// 定义一个点击监听器,它实现了接口View.OnClickListener
class MyOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) { // 点击事件的处理方法
}String desc = String.format("%s 点击了按钮:%s", ((Button) v).getText()); tv_result.setText(desc); // 设置文本视图的文本内容
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 长按监听器:通过`setOnLongClickListener`方法设置。按钮被按住超过500毫秒时,会触发长按事件。
- ```java
// 从布局文件中获取名为btn_click_public的按钮控件
Button btn_longclick_public = findViewById(R.id.btn_longclick_public);
// 设置长按监听器,一旦用户长按按钮,就触发监听器的onLongClick方法
btn_longclick_public.setOnLongClickListener(this);
@Override
public boolean onLongClick(View v) { // 长按事件的处理方法
if (v.getId() == R.id.btn_longclick_public) { // 来自于按钮
btn_longclick_public
String desc = String.format("%s 长按了按钮:%s", ((Button)v).getText());
tv_result.setText(desc); // 设置文本视图的文本内容
}
return true;
}
- ```java
点击监听器和长按监听器不局限于按钮控件,其实它们都来源于视图基类View,凡是从View派生而来的各类控件,均可注册点击监听器和长按监听器。譬如文本视图TextView,其对象也能调用setOnClickListener方法与setOnLongClickListener方法,此时TextView控件就会响应点击动作和长按动作。
因为按钮存在按下和松开两种背景,便于提示用户该控件允许点击,但文本视图默认没有按压背景,不方便判断是否被点击,所以一般不会让文本视图处理点击事件和长按事件。
禁用与恢复按钮
- 不可用按钮:按钮不允许点击,即使点击也没反应,同时按钮文字为灰色。
- 可用按钮:按钮允许点击,点击按钮会触发点击事件,同时按钮文字为正常的黑色。
1 | btn_test.setEnabled(true); // 启用当前控件 |
图像显示
图片一般放在res/drawable目录下,设置图像显示一般有两种方法:
- 在XML文件中,通过属性android:src设置图片资源,属性值格式形如 @drawable/不含扩展名的图片名称。
- 在Java代码中,调用setImageResource方法设置图片资源,方法参数格式形如 R.drawable.不含扩展名的图片名称。
(1)图像的缩放问题:
ImageView本身默认图片居中显示,若要改变图片的显示方式,可通过scaleType属性设定,该属性的取值说明如下:
图像视图ImageView
由于图像通常保存为单独的图片文件,因此需要先把图片放到res/drawable目录,然后再去引用该图片的资源名称。XML文件通过属性android:src设置图片资源,属性值格式形如“@drawable/不含扩展名的图片名称”。
1 | <ImageView |
ImageView本身默认图片居中显示,不管图片有多大抑或有多小,图像视图都会自动缩放图片,使之刚好够着ImageView的边界,并且缩放后的图片保持原始的宽高比例,看起来图片很完美地占据视图中央。这种缩放类型在XML文件中通过属性android:scaleType
定义,即使图像视图未明确指定该属性,系统也会默认其值为fitCenter,表示让图像缩放后居中显示。
1 | <ImageView |
在Java代码中可调用setScaleType
方法设置图像视图的缩放类型,其中fitCenter
对应的类型为ScaleType.FIT_CENTER
1 | // 将缩放类型设置为“保持宽高比例,缩放图片使其位于视图中间” |
可选值如下:
fitXY
:对图像的横向与纵向进行独立缩放,使得该图片完全适应ImageView,但是图片的横纵比可能会发生改变fitStart
:保持纵横比缩放图片,知道较长的边与Image的边长相等,缩放完成后将图片放在ImageView的左上角fitCenter
:同上,缩放后放于中间;fitEnd
:同上,缩放后放于右下角;center
:保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size,超过部分裁剪处理。centerCrop
:保持横纵比缩放图片,知道完全覆盖ImageView,可能会出现图片的显示不完全centerInside
:保持横纵比缩放图片,直到ImageView能够完全地显示图片matrix
:默认值,不改变原图的大小,从ImageView的左上角开始绘制原图,原图超过ImageView的部分作裁剪处理
图像按钮ImageButton:
ImageButton是显示图片的图像按钮,但它继承自ImageView,而非继承Button。
ImageButton和Button之间的区别有:
- Button既可显示文本也可显示图片,ImageButton只能显示图片不能显示文本。
- ImageButton上的图像可按比例缩放,而Button通过背景设置的图像会拉伸变形。
- Button只能靠背景显示一张图片,而ImageButton可分别在前景和背景显示图片,从而实现两张图片叠加的效果。
同时展示文本与图像
Button标签通过属性android:drawableTop设置了文字上边的图标,若想变更图标所处的位置,
只要把drawableTop换成对应方向的属性即可
drawableTop
:指定文字上方的图片。drawableBottom
:指定文字下方的图片。drawableLeft
:指定文字左边的图片。drawableRight
:指定文字右边的图片。drawablePadding
:指定图片与文字的间距。
