1.TextView基础
目录
- 简介
- 常用属性
- 常见功能需求实现
- TextView点击效果
- TextView的XML本地化数据交换格式
- TextView实现富文本
- TextView不等文字对齐
- TextView实现文字换行
- 常见问题
- 小技巧
1.简介
- 向用户展示文本信息,并且用户可以选择是否编辑文本
- 一个TextView是一个完整的文本编辑器,但是它默认不支持编辑,如需编辑,请使用其子类EditText
2.常用属性
NO | 属性 | 作用 |
---|---|---|
1 | android:text | 显示文本信息 |
2 | android:textColor | 设置文字颜色 |
3 | android:textSize | 设置文字大小 |
4 | android:textStyle | 设置文字字形 |
5 | android:typeface | 设置文字字体 |
6 | 文字是否单行显示 | |
7 | android:lines | 设置文本行数 |
8 | android:maxLines | 文字显示最大行数 |
9 | android:minLines | 设置文本显示最小行数 |
10 | android:ellipsize | 是否显示省略号(需要NO.5) |
11 | android:drawableStart | 文字开头添加图片(适配RTL) |
12 | android:drawableEnd | 文字末尾添加图片(适配RTL) |
13 | android:drawableTop | 文字顶部添加图片 |
14 | android:drawableBottom | 文字底部添加图片 |
15 | android:drawableLeft | 文字左侧添加图片 |
16 | android:drawableRight | 文字右侧添加图片 |
17 | android:drawableTint | 给添加的图片着色(API level 23) |
18 | android:drawablePadding | 图片的内边距(图片文字距离) |
19 | android:gravity | 文本内容在控件中显示位置 |
20 | android:shadowColor | 文字阴影颜色 |
21 | android:shadowDx | 文字阴影x轴距离 |
22 | android:shadowDy | 文字阴影y轴距离 |
23 | android:shadowRadius | 文字阴影的半径 |
24 | android:lineSpacingExtra | 设置行间距 |
25 | android:lineSpacingMultiplier | 设置行间距的倍数 |
26 | android:maxLength | 限制显示的文本长度 |
27 | android:ems | 限制TextView宽度为N个字符长度 |
28 | android:minEms | 限制TextView宽度最短为N个字符长度 |
29 | android:maxEms | 限制TextView宽度最长为N个字符长度 |
30 | android:textScaleX | 设置字间距 |
31 | android:height | 设置文本区域的高度 |
32 | android:maxHeight | 设置文本区域的最大高度 |
33 | android:minHeight | 设置文本区域的最小高度 |
34 | android:width | 设置文本区域的宽度 |
35 | android:maxWidth | 设置文本区域的最大宽度 |
36 | android:minWidth | 设置文本区域的最小宽度 |
2.1 android:text
- 基本使用
添加一个String
<TextView ...android:text="自导自演的机器人" />
- 正确使用
- 将需要提示的文字,一律写在res-values-string.xml中,这样是为了国际化,方便统一的修改。
<TextView ...android:text="@string/name" />
- string.xml文件
<resources>
<string name="name">自导自演的机器人</string>
</resources>
2.2 android:textColor
- 基本使用
添加一个RGB值<TextView ...android:textColor="#3F51B5" />
- 正确使用
- 将需要设置的颜色,一律写在res-values-colors中,方便统一的修改。
<TextView ...android:textColor="@color/colorPrimary" />
- colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
</resources>
2.3 android:textSize
- 基本使用
添加一个大于0的数值,单位为sp
<TextView ...android:textSize="16sp"/>
- 正确使用
- 将需要设置的文字大小,一律写在res-values-dimen中,这样是为了国际化,方便统一的修改。
<TextView ...android:textSize="@dimen/tv_size"/>
- dimen.xml
<resources>
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="tv_size">16sp</dimen>
</resources>
- 如果不明白sp和dp的请参考:[两分钟理解Android中SP与DP的区别-技术小黑屋](http://droidyue.com/blog/2016/09/05/dp-vs-sp-in-android/)
---
##### 2.4 android:textStyle
- 修改字形(**支持组合使用:bold|italic**)
- normal(默认)
![](https://img.haomeiwen.com/i1348484/c48a18296675828a.png)
- italic(斜体)
![](//upload-images.jianshu.io/upload_images/1348484-9ff311532ef3da91.png)
- bold(粗体)
![](//upload-images.jianshu.io/upload_images/1348484-b2f9d41923cce13d.png)
---
##### 2.5 android:typeface
- 修改字体
- normal
- sans
- serif
- monospace
---
##### 2.6 ~~android:singleLine~~
- 是否单行显示,默认是多行显示
android:singleLine="false"
![](//upload-images.jianshu.io/upload_images/1348484-d6d9e0a9636ebd3e.png)
- 防止文字过多而造成布局挤压问题
android:singleLine="true"
![](//upload-images.jianshu.io/upload_images/1348484-523d2b4cab496f5b.png)
- 已过时,被**android:maxLines="1"**取代
---
##### 2.7 android:lines
- 文本显示固定的行数
- 比如设置数值为2
android:lines="2"
如果文本行数小于2,强制显示2行,不足部分补空白
如果文本行数大于2,强制显示2行,多余部分省略
---
##### 2.8 android:maxLines
- 添加大于等于0的整数
- 如果是0,则无显示
- 如果是1,等同于**android:singleLine="true"**,但是没有省略符号
android:maxLines="1"
![](//upload-images.jianshu.io/upload_images/1348484-efb604798fffa248.png)
---
##### 2.9 android:minLines
- 文本最小显示行数
- 不足部分补空白
- 多余部分不处理
---
##### 2.10 android:ellipsize
- 有五个选项
- end 在末尾省略
- start 在开始省略
- middle 在中间省略
- marquee 走马灯(不建议使用,cpu消耗比较大)
- none 不省略(默认模式)
---
##### 2.11~2.18
- 添加图片,以及设置图片内边距
android:drawableTop="@mipmap/ic_launcher"
android:drawableBottom="@mipmap/ic_launcher"
android:drawableLeft="@mipmap/ic_launcher"
android:drawableRight="@mipmap/ic_launcher"
android:drawablePadding="@dimen/activity_horizontal_margin"
- 效果图
![](http://upload-images.jianshu.io/upload_images/1348484-52123b723e0bdf25.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 可以用来简化布局层次
---
##### 2.19 android:gravity
- 支持组合使用
|属性|含义|
|:---:|:---:|
|center|文字居中|
|center_vertical|文字垂直居中|
|center_horizontal|文字水平居中|
|left|文字左对齐|
|right|文字右对齐|
|top|文字顶部对齐|
|bottom|文字底部对齐|
|start|文字开头对齐(适配RLT)|
|end|文字结尾对齐(适配RLT)|
|clip_vertical|沿着对象的垂直轴裁剪|
|clip_horizontal|沿着对象的水平轴裁剪|
|fill|fill_vertical和fill_horizontal,拉伸充满控件|
|fill_horizontal|left和right,横向拉伸充满控件|
|fill_vertical|top和bottom,纵向拉伸充满控件|
---
##### 2.20~2.23
- 添加文字阴影效果
<TextView ...
android:shadowColor="@color/colorAccent"
android:shadowDx="100"
android:shadowDy="-10"
android:shadowRadius="2"/>
- 效果图
![](http://upload-images.jianshu.io/upload_images/1348484-fa4d8e48219a52c9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- android:shadowColor设置阴影效果颜色
- android:shadowDx是阴影效果距离控件的x轴偏移量,单位是px,可以为负值
- android:shadowDy是阴影效果距离控件的y轴偏移量,单位是px,可以为负值
- android:shadowRadius是阴影效果的半径,单位是px,不宜数值过大
---
#### 3.常见功能需求实现
|NO|需求|
|:---:|:---:|
|1|TextView点击效果|
|2|TextView的XML本地化数据交换格式|
|3|TextView实现富文本|
|4|TextView不等文字对齐|
|5|TextView实现文字换行|
---
##### 3.1 TextView点击效果
- 建立drawable文件
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="@color/colorAccent" />
<item android:state_focused="true" android:color="@color/colorAccent" />
<item android:state_pressed="true" android:color="@color/colorAccent" />
<item android:color="@color/colorPrimary"/>
</selector>
- 将drawable应用于textColor属性
<TextView ...android:textColor="@drawable/select_tv_text"/>
---
##### 3.2 TextView的XML本地化数据交换格式
- 有时候TextView的文本内容需要动态的改变显示,比如显示“1个机器人”
![](http://upload-images.jianshu.io/upload_images/1348484-b038721598f80deb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 你可能会这样
int robotNum=3;
tvDemo.setText(robotNum+"本书");
- 上面的方法虽然不会出错,但是**Android Studio**还是会给你提出警告
- 正确方式
int robotNum=3;
tvDemo.setText(getString(R.string.robot_num,robotNum));
<string name="robot_num">%d个机器人</string>
- 参考文章
- [《Android中String资源文件的可变参数设定(String.format()的详细用法)》lance_小超](http://www.jianshu.com/p/9855d6a7596d)
---
##### 3.3 TextView实现富文本
- 有时候单一的文字,已经满足不了你的需求,你可能需要在某一段文字的第一个字设置为红色,第二个字设置为蓝色,或者又为第三个字添加点击效果,那么请参考如下文章.
- 参考文章
- [《【Android】强大的SpannableStringBuilder》带心情去旅行 ](http://www.jianshu.com/p/f004300c6920)
- [《用SpannableString打造绚丽多彩的文本显示效果》 码农小阿飞](http://www.jianshu.com/p/84067ad289d2)
---
##### 3.4 TextView不等文字对齐
- 有时候你需要实现不同的文字字数对齐的效果
![](http://upload-images.jianshu.io/upload_images/1348484-1a0af6feecef236c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- [《TextView-不等字数两端对齐》](http://www.jianshu.com/p/d8f50509b1e9)
---
##### 3.5 TextView实现文字换行
- 在string中加入换行符 **\n**
---
#### 4.常见问题
|NO|问题|
|:---:|:---:|
|1|java代码添加drawable无效|
---
##### 4.1 java代码添加drawable无效
- 在XML中我们可以直接通过**android:drawableLeft**添加一张图片,而在java代码中我们可以使用如下方法,添加一张图片
setCompoundDrawables(@Nullable Drawable left, @Nullable Drawable top,
@Nullable Drawable right, @Nullable Drawable bottom)
- 错误示例代码,这样根本无法显示图片
tv.setCompoundDrawables(getResources().getDrawable(R.mipmap.ic_launcher),null,null,null);
- 错误原因,没有给图片设置宽高
- 正确写法
Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
tv.setCompoundDrawables(drawable,null,null,null);