参考资料:
《Android应用程序开发》ISBN 9787302283164
参考软件:
Android Studio、Eclipse+ADT、Android SDK、JDK
用户界面基础
用户界面(User Interface,UI)是系统和用户之间进行信息交换的媒介,实现信息的内部形式与人类可以接受形式之间的转换
在计算机出现早期,批处理界面(1945-1968)和命令行界面(1969-1983)得到广泛的使用
目前,流行图像用户界面(Graphical User Interface,GUI),采用图形方式与用户进行交互的界面
未来的用户界面将更多的运用虚拟现实技术,使用户能够摆脱键盘与鼠标的交互方式,而通过动作、语言,甚至是脑电波来控制计算机
一、Android用户界面框架
Android用户界面框架采用MVC(Model-View-Controller)模型
控制器(Controller)处理用户输入
视图(View)显示用户界面和图像
模型(Model)保存数据和代码
*图取自网络,MVC模型
Android用户界面框架采用视图树(View Tree)模型
由View和ViewGroup构成
*图取自网络,View Tree模型
二、TextView
常见属性
android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all)
android:autoText如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。
android:bufferType指定getText()方式取得的文本类别。选项editable 类似于StringBuilder可追加字符,也就是说getText后可调用append方法设置文本内容。spannable 则可在给定的字符区域使用样式,参见这里1、这里2。
android:capitalize设置英文字母大写类型。此处无效果,需要弹出输入法才能看得到,参见EditView此属性说明。
android:cursorVisible设定光标为显示/隐藏,默认显示。
android:digits设置允许输入哪些字符。如“1234567890.+-*/% ()”
android:drawableBottom在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。
android:drawableLeft在text的左边输出一个drawable,如图片。
android:drawablePadding设置text与drawable(图片)的间隔,与drawableLeft、drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。
android:drawableRight在text的右边输出一个drawable,如图片。
android:drawableTop在text的正上方输出一个drawable,如图片。
android:editable设置是否可编辑。这里无效果,参见EditView。
android:editorExtras设置文本的额外的输入数据。在EditView再讨论。
android:ellipsize设置当文字过长时,该控件该如何显示。有如下值设置:”start”—?省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)
android:freezesText设置保存文本的内容以及光标的位置。参见:这里。
android:gravity设置文本位置,如设置成“center”,文本将居中显示。
android:hintText为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。此属性在EditView中使用,但是这里也可以用。
android:imeOptions附加功能,设置右下角IME动作与编辑框相关的动作,如actionDone右下角将显示一个“完成”,而不设置默认是一个回车符号。这个在EditView中再详细说明,此处无用。
android:imeActionId设置IME动作ID。在EditView再做说明,可以先看这篇帖子:这里。
android:imeActionLabel设置IME动作标签。在EditView再做说明。
android:includeFontPadding设置文本是否包含顶部和底部额外空白,默认为true。
android:inputMethod为文本指定输入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是这里报错找不到。
android:inputType设置文本的类型,用于帮助输入法显示合适的键盘类型。在EditView中再详细说明,这里无效果。
android:linksClickable设置链接是否点击连接,即使设置了autoLink。
android:marqueeRepeatLimit在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为marquee_forever时表示无限次。
android:ems设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度,如图:
android:maxEms设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。
android:minEms设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。
android:maxLength限制显示的文本长度,超出部分不显示。
android:lines设置文本的行数,设置两行就显示两行,即使第二行没有数据。
android:maxLines设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。
android:minLines设置文本的最小行数,与lines类似。
android:lineSpacingExtra设置行间距。
android:lineSpacingMultiplier设置行间距的倍数。如”1.2”
android:numeric如果被设置,该TextView有一个数字输入法。此处无用,设置后唯一效果是TextView有点击效果,此属性在EdtiView将详细说明。
android:password以小点”.”显示文本
android:phoneNumber设置为电话号码的输入方式。
android:privateImeOptions设置输入法选项,此处无用,在EditText将进一步讨论。
android:scrollHorizontally设置文本超出TextView的宽度的情况下,是否出现横拉条。
android:selectAllOnFocus如果文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。TextView中设置后无效果。
android:shadowColor指定文本阴影的颜色,需要与shadowRadius一起使用。效果:
android:shadowDx设置阴影横向坐标开始位置。
android:shadowDy设置阴影纵向坐标开始位置。
android:shadowRadius设置阴影的半径。设置为0.1就变成字体的颜色了,一般设置为3.0的效果比较好。
android:singleLine设置单行显示。如果和layout_width一起使用,当文本不能全部显示时,后面用“…”来表示。如android:text="test_ singleLine " android:singleLine="true" android:layout_width="20dp"将只显示“t…”。如果不设置singleLine或者设置为false,文本将自动换行
android:text设置显示文本.
android:shadowDx设置阴影横向坐标开始位置。
android:shadowDy设置阴影纵向坐标开始位置。
android:shadowRadius设置阴影的半径。设置为0.1就变成字体的颜色了,一般设置为3.0的效果比较好。
android:singleLine设置单行显示。如果和layout_width一起使用,当文本不能全部显示时,后面用“…”来表示。如android:text="test_ singleLine " android:singleLine="true" android:layout_width="20dp"将只显示“t…”。如果不设置singleLine或者设置为false,文本将自动换行
android:text设置显示文本.
android:textSize设置文字大小,推荐度量单位”sp”,如”15sp”
android:textStyle设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 可以设置一个或多个,用“|”隔开
android:typeface设置文本字体,必须是以下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3]
android:height设置文本区域的高度,支持度量单位:px(像素)/dp/sp/in/mm(毫米)
android:maxHeight设置文本区域的最大高度
android:minHeight设置文本区域的最小高度
android:width设置文本区域的宽度,支持度量单位:px(像素)/dp/sp/in/mm(毫米),与layout_width的区别看这里。
android:maxWidth设置文本区域的最大宽度
android:minWidth设置文本区域的最小宽度
android:textAppearance设置文字外观。如“?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。
可设置的值如下:
textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse
android:textAppearance设置文字外观。如“?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。
可设置的值如下:
textAppearanceButton、textAppearanceInverse、textAppearanceLarge、textAppearanceLargeInverse、textAppearanceMedium、textAppearanceMediumInverse
常用代码
1、让一个TextView中的关键字高亮显示publicvoidhighlight(String target){
String temp=getText().toString();
SpannableStringBuilder spannable =newSpannableStringBuilder(temp);
CharacterStyle span=null;
Pattern p = Pattern.compile(target);
Matcher m = p.matcher(temp);
while(m.find()) {
span =newForegroundColorSpan(Color.RED);//需要重复!
//span = new ImageSpan(drawable,ImageSpan.XX);//设置现在图片spannable.setSpan(span, m.start(), m.end(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
setText(spannable);
}
2、显示富文本通过第一个例子来讲解一下TextView使用HTML标签设定样式和通过autoLink属性来设置超链接效果,在XML布局文件中定义两个TextView,分别展示HTML标签和autoLink属性的使用。
XML布局文件textviewdemo.xml代码:
1<?xml version="1.0"encoding="utf-8"?>
2
3android:layout_width="match_parent"
4android:layout_height="match_parent"
5android:orientation="vertical">
6
7android:id="@+id/textView1"
8android:layout_width="fill_parent"
9android:layout_height="wrap_content"
10android:padding="20sp"
11/>
12
13android:id="@+id/textView2"
14android:layout_width="fill_parent"
15android:layout_height="wrap_content"
16android:padding="20sp"
17android:autoLink="all"
18android:textSize="20sp"
19/>
20
Activity文件textViewDemoActivity.java代码:
1packagecn.bgxt.textviewdemo;
2
3importandroid.app.Activity;
4importandroid.os.Bundle;
5importandroid.text.Html;
6importandroid.text.method.LinkMovementMethod;
7importandroid.widget.TextView;
8
9publicclasstextViewDemoActivityextendsActivity {
10
11privateTextView textView1,textView2;
12publictextViewDemoActivity() {
13// TODOAuto-generated constructor stub
14}
15@Override
16protectedvoidonCreate(Bundle savedInstanceState) {
17// TODOAuto-generated method stub
18super.onCreate(savedInstanceState);
19setContentView(R.layout.textviewdemo);
20//通过Id获得两个TextView控件
21textView1=(TextView)findViewById(R.id.textView1);
22textView2=(TextView)findViewById(R.id.textView2);
23
24//设置需要显示的字符串
25String html="Helloandroid
";
26html+="Helloandroid
";
27html+="百度";
28//使用Html.fromHtml,把含HTML标签的字符串转换成可显示的文本样式
29CharSequence charSequence=Html.fromHtml(html);
30//通过setText给TextView赋值
31textView1.setText(charSequence);
32//设定一个点击的响应
33textView1.setMovementMethod(LinkMovementMethod.getInstance());
34
35String text="我的URL:http://www.cnblogs.com/plokmju/\n";
36text+="我的email:plokmju@sina.com\n";
37text+="我的电话:+86 010-12345678";
38//因为textView2中有autoLink=”all“的属性设定,所以会自动识别对应的连接,点击出发对应的Android程序
39textView2.setText(text);
40}
41
42}
显示效果:
3、TextView显示图片在TextView中显示图片的例子,依然是使用HTML标签的方式定义样式,但是使用的是Html.fromHtml()的另外一个重载的静态方法,可以设定标签中的图像资源。
static Spanned fromHtml(Stringsource,Html.ImageGetter imageGetter,Html.TagHandler tagHandler)
对于这个方法,在imageGetter参数中设定标签中的图像资源文件,tagHandler主要是为了处理Html类无法识别的html标签的情况,一般不会用上,传值为null即可。
布局XML文件textvideforimg.xml代码:
1<?xml version="1.0"encoding="utf-8"?>
2
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical">
6
7 android:id="@+id/textImg"
8 android:layout_width="fill_parent"
9 android:layout_height="match_parent"
10 android:layout_margin="10dp"/>
11
Activity文件textviewForImgActivity.java代码:
1package cn.bgxt.textviewdemo;
2
3import java.lang.reflect.Field;
4
5import android.R.color;
6import android.app.Activity;
7import android.graphics.drawable.Drawable;
8import android.os.Bundle;
9import android.text.Html;
10import android.text.Html.ImageGetter;
11import android.text.method.LinkMovementMethod;
12import android.widget.TextView;
13
14publicclass textviewForImgActivity extends Activity {
15
16 private TextView textViewImg;
17 public textviewForImgActivity() {
18 // TODOAuto-generated constructor stub
19 }
20
21 @Override
22 protectedvoid onCreate(Bundle savedInstanceState) {
23 // TODOAuto-generated method stub
24 super.onCreate(savedInstanceState);
25 setContentView(R.layout.textvideforimg);
26
27 textViewImg=(TextView)findViewById(R.id.textImg);
28 textViewImg.setTextColor(color.white);
29 textViewImg.setBackgroundColor(color.black);
30 textViewImg.setTextSize(20);
31 //设定HTML标签样式,图片3为一个超链接标签a
32 String html="图像1图像2\n";
33 html+="图像3";
34 //fromHtml中ImageGetter选择html中的图片资源
35 CharSequence cs=Html.fromHtml(html, newImageGetter() {
36
37 publicDrawable getDrawable(String source) {
38 //source为html字符串中定义的中的src的内容
39 //返回值Drawable就是对应的显示的图片资源
40 Drawable draw=null;
41 if(source.equals("image1"))
42 {
43 draw=getResources().getDrawable(R.drawable.image1);
44 draw.setBounds(0, 0,draw.getIntrinsicWidth(), draw.getIntrinsicHeight());
45 }
46 elseif(source.equals("image2"))
47 {
48 //设定image2尺寸等比缩小
49 draw=getResources().getDrawable(R.drawable.image2);
50 draw.setBounds(0, 0,draw.getIntrinsicWidth()/2, draw.getIntrinsicHeight()/2);
51 }
52 else
53 {
54 //使用反射会更简便,无需知道src与资源Id的对应关系
55 draw=getResources().getDrawable(getResourceId(source));
56 draw.setBounds(0, 0,draw.getIntrinsicWidth(), draw.getIntrinsicHeight());
57 }
58 return draw;
59 }
60 }, null);
61 textViewImg.setText(cs);
62 textViewImg.setMovementMethod(LinkMovementMethod.getInstance());
63 }
64
65 publicint getResourceId(String source)
66 {
67 try {
68 //使用反射机制,通过属性名称,得到其内的值
69 Field field=R.drawable.class.getField(source);
70 return Integer.parseInt(field.get(null).toString());
71 } catch (Exception e) {
72 // TODO: handleexception
73 }
74 return 0;
75 }
76
77 }
效果截图,其中第三个图片点击会触发浏览器访问百度网址:
4、在TextView增加Click事件在TextView添加点击事件,导航到其他的Activity中。使用SpannableString.setSpan()设定那一段文本需要相应点击事件。与之类似的还有SpannableBuilder对象,他们的关系和String与StringBuilder一样。
void setSpan(Object what,int start,intend,int flags)
在what参数中传递一个抽象类ClickableSpan,需要实现其onClick()方法,此为指定文本的点击相应时间。start和end分别指定需要响应onClick()方法的文本开始与结束。flags设定一个标识,确定使用什么方式选择文本块,一般使用Spanned接口下的SPAN_EXCLUSIVE_EXCLUSIVE对其进行赋值,表示遵循设定的开始于结束位置的文本块。
布局文件activityclick.xml的代码:
1<?xml version="1.0"encoding="utf-8"?>
2
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical">
6
7 android:id="@+id/clickTextView1"
8 android:textSize="30dp"
9 android:layout_marginTop="30dp"
10 android:layout_width="match_parent"
11 android:layout_height="wrap_content"/>
12
13 android:textSize="30dp"
14 android:layout_marginTop="30dp"
15 android:id="@+id/clickTextView2"
16 android:layout_width="match_parent"
17 android:layout_height="wrap_content"/>
18
Activity文件TextViewOnClickActivity.java的代码:
1package cn.bgxt.textviewdemo;
2
3import android.app.Activity;
4import android.content.Intent;
5import android.os.Bundle;
6import android.text.SpannableString;
7import android.text.Spanned;
8import android.text.method.LinkMovementMethod;
9import android.text.style.ClickableSpan;
10import android.view.View;
11import android.widget.TextView;
12
13publicclass TextViewOnClickActivity extends Activity {
14
15 private TextView clickTextView1,clickTextView2;
16
17 public TextViewOnClickActivity() {
18 }
19
20 @Override
21 protectedvoid onCreate(Bundle savedInstanceState) {
22 super.onCreate(savedInstanceState);
23 setContentView(R.layout.activityclick);
24
25 clickTextView1=(TextView)this.findViewById(R.id.clickTextView1);
26 clickTextView2=(TextView)this.findViewById(R.id.clickTextView2);
27 String text1="显示Activity1";
28 String text2="显示Activity2";
29 //使用SpannableString存放字符串
30 SpannableString spannableString=newSpannableString(text1);
31 SpannableString spannableString2=newSpannableString(text2);
32 //通过setSpan设定文本块响应的点击事件
33 //此处只设定文本的索引为2开始的文本块:Activity1
34 spannableString.setSpan(new ClickableSpan() {
35 @Override
36 publicvoid onClick(View widget) {
37 //导航到一个新的 Activity1中
38 Intent intent=newIntent(TextViewOnClickActivity.this,Activity1.class);
39 startActivity(intent);
40 }
41 }, 2, text1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
42
43 spannableString2.setSpan(new ClickableSpan() {
44
45 @Override
46 publicvoid onClick(View widget) {
47 // TODO Auto-generated method stub
48 Intent intent=newIntent(TextViewOnClickActivity.this,Activity2.class);
49 startActivity(intent);
50 }
51 }, 2, text1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
52
53 //对TextView文本进行赋值
54 clickTextView1.setText(spannableString);
55 //设置点击响应
56 clickTextView1.setMovementMethod(LinkMovementMethod.getInstance());
57 clickTextView2.setText(spannableString2);
58 clickTextView2.setMovementMethod(LinkMovementMethod.getInstance());
59
60
61
62 }
63 }
效果图,从图中可以看出只有点击setSpan中设定的代码块才可以触发点击事件:
5、一些小技巧http://blog.csdn.net/hero_zhouwu/article/details/9705647