7.3 Android的基本控件介绍
控件是构造界面的基本单元。为了帮助更好地进行界面的构造,Android提供了大量的基础控件。对于开发者而言,只有了解这些控件的实现特征和使用方式,才能够更快更好地进行交互界面的开发。
图7-9展示了Android中一些常用控件的继承关系,图的上部是容器控件,下部是非容器控件。本节会分类介绍其中的重要控件。
图 7-9 基础控件继承关系图
7.3.1 文本控件
文本控件用于在界面上呈现或输入文字信息,对于任何应用而言它几乎都是必不可少的控件之一。Android的文本控件指的是android.widget.TextView类及其子类,包括按钮控件android.widget.Button、复选控件android.widget.CheckBox、文本编辑控件android.widget.EditText,等等。
文本控件的主要属性包括:
❑字体样式
在Android的文本控件中,可以通过TextView.setTextColor函数设定文本颜色,通过TextView.setTextSize函数改变字体的大小,通过TextView.setTypeface函数修改字体的样式。
在Android中,文本的样式定义为android.graphics.Typeface类,Typeface可支持普通(Normal)、斜体(Italic)和粗体(Blod)三种字形,以及普通(Normal)、有衬线(Serif)、无衬线(Sans Serif)、等宽(Monospace)四种字体模式。在默认情况下,Android为部分字形和字体模式的组合都提供了一个字体文件,开发者可以根据自己的需求进行设定,比如,选择默认字体模式的粗体字,可以进行如下设置:
aTextView.setTypeface(Typeface.DEFAULT_BOLD);
如果Android提供的所有字体都无法满足应用需求,开发者可以为文本控件自定义字体。Android支持ttf[1]格式的字体文件,开发者可以将自定义字体生成ttf格式的字体文件,添加到应用的asset目录下,在程序中为其动态构建和设置Typeface对象:
Typeface customFace=Typeface.createFromAsset(
getAssets(),"custom.ttf");
aTextView.setTypeface(customFace);
文本控件除了支持字体、颜色、大小等最基本的文本属性之外,还支持投影等更复杂的文本显示效果。开发者可以通过TextView.setShadowLayout函数,来设置文本投影的颜色、角度和位移等参数。
在Android开发中,如果需要支持更为个性化的文本呈现,开发者可以通过设置文本投影、使用自定义字体等手段来解决,而不应该通过文本图像的方式来实现。因为从本质上来说,字体是矢量图形,而图像则是位图格式,Android设备支持各式各样的屏幕大小和分辨率,利用图像进行呈现,只能满足部分设备的要求,在其他设备上可能会导致字体失真而无法辨识,降低应用的兼容性。
❑文本段落
Android的文本控件不仅可以呈现单行文本信息,也可以呈现多行文本内容。开发者可以通过TextView.setMaxLines、TextView.setMinLines和TextView.setMaxLength等函数来控制文本的最大最小行数,以及文本的数量。
但由于屏幕控件有限,很多时候必须在有限的空间内展示很多的文本内容,此时,就需要对文本内容进行截取。如果是单行文本(通过TextView.setSingleLine函数设置),开发者可以使用TextView.setEllipsize函数设定文本的截取方式。TextView支持从头部、尾部或中部进行文本截取,并通过省略号来表示被截去的部分。除了简单的截取,TextView还支持走马灯式的单行文本呈现,控件中的文本内容可以通过水平循环滚动的形式来展示,其设置方式如下:
aTextView. setEllipsize(TextUitls.TruncateAt.MARQUEE);
文本控件除了支持对文本行数的控制,还可以通过TextView.setLineSpace函数设置行距,通过TextView.setGravity设置文本的水平和垂直对齐模式。通过这些接口,使得文本控件能够满足各种文本段落模式的展示需求。
❑富文本
在很多场景下,需要在同一段文本中用不同的颜色、字形、大小和间距去呈现部分文字的内容,甚至是在其中穿插图像信息,我们将这样的文本称为富文本(Rich Text)。
在Android中,文本控件TextView可以支持各类富文本信息的展示。文本控件中的内容通过TextView.setText函数进行设置,该函数接受一个java.lang.CharSequence接口的实现对象。如果需要在文本控件中呈现普通文本内容,可以传入一个字符串String对象;而如果需要实现富文本的展示,则可以利用android.text.SpannableString对象。
SpannableString类实现了CharSequence接口,用于表示一段字符串信息,开发者可以使用SpannableString.setSpan函数为其中任意子串设置样式,比如通过如下代码,可将“红色”这两个字的前景色设置为红色:
//构造字符串对象
SpannableString text=new SpannableString("火焰是红色的");
//设置“红色”二字的前景色为红色
ForegroundColorSpan redColor=new ForegroundColorSpan(
Color.RED);
text.setSpan(redColor,
3,5,Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
//设置到文本控件中
aTextView.setMovementMethod(
LinkMovementMethod.getInstance());
aTextView.setText(text);
其中ForegroundColorSpan类用于表示字符的前景色,它位于android.text.style包中。该包内包含了各种表示字符或段落样式的类,如图7-10所示,表示字符样式的类都派生自android.text.style.CharacterSytle。除了ForegroundColorSpan,还可以通过ClickableSpan对象为指定的文本增加链接,通过ImageSpan对象来插入图片信息,等等。而实现了android.text.style.ParagrahStyle接口的类,则用于表达段落样式。开发者也可以通过继承的方式,去扩展所需的富文本样式。
图 7-10 富文本字符样式
手动构造富文本的内容是非常繁琐的事情,为了简化编程方式,在Android的文本控件中,还可以使用HTML来描述富文本的内容。调用TextView.setAutoLinkMask函数可以使文本控件自动寻找文本中可能有的电话号码、邮件地址、URL等信息,并为其加上链接。而通过android.text.Html类,开发者则可以将一段HTML格式的文本转换成文本控件所支持的富文本格式数据,从而能够便捷地按照文本格式呈现出HTML相关的内容。比如:
Static final String sampleHtml=
"This is a<b>sample</b>text."
aTextView.setText(Html.fromHtml(sampleHtml);
❑文本编辑
文本控件除了能够用于展示文本编辑控件,还可以进行文本输入。在Android中,开发者通常通过android.widget.EditText控件来进行文本输入。EditText是TextView的子类,因此它也可以设置字体、齐位、颜色等属性。
此外,在文本编辑状态下,还可以通过TextView.setInputType对输入的文本类型做限制。输入文本类型由一组标志位构成,比如输入控件仅接受日期,则可进行如下设置:
aTextView.setInputType(InputType.TYPE_CLASS_DATETIME|
InputType.TYPE_DATETIME_VARIATION_TIME);
合理地设置输入文本类型,不仅能够控制文本控件接受的字符类型,还可以引导输入法来变更虚拟键盘的样式,使用户能够更便捷地进行输入。
如果期望将编辑控件设置为只读状态,不接受任何输入和修改,也要通过输入文本类型来进行设置,同时还需要将控件设置为不可用状态:
aTextView.setInputType(InputType.TYPE_NULL);
aTextView.setEnabled(false);
[1]关于ttf字体文件的介绍,可参见:http://en.wikipedia.org/wiki/TrueType。