有效字符区域 获取textview_第五章 用户界面基础(TextView的使用)

参考资料:

《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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值