欢迎光临散文网 会员登陆 & 注册

第五章 用户界面基础(TextView的使用)

2018-11-03 21:40 作者:swiss126  | 我要投稿

参考资料:

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中的关键字高亮显示

public void highlight(String target){  
        String temp=getText().toString();  
        SpannableStringBuilder spannable = new SpannableStringBuilder(temp);  
        CharacterStyle span=null;  
          
        Pattern p = Pattern.compile(target);  
        Matcher m = p.matcher(temp);  
        while (m.find()) {  
            span = new ForegroundColorSpan(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<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 3    android:layout_width="match_parent"

 4    android:layout_height="match_parent"

 5    android:orientation="vertical">   

 6     <TextView

 7         android:id="@+id/textView1"

 8        android:layout_width="fill_parent"

 9        android:layout_height="wrap_content"

10        android:padding="20sp"

11        />

12     <TextView

13        android:id="@+id/textView2"

14        android:layout_width="fill_parent"

15        android:layout_height="wrap_content"

16        android:padding="20sp"

17        android:autoLink="all"

18        android:textSize="20sp"

19        />

20</LinearLayout>


Activity文件textViewDemoActivity.java代码:


 1package cn.bgxt.textviewdemo;

 2

 3import android.app.Activity;

 4import android.os.Bundle;

 5import android.text.Html;

 6import android.text.method.LinkMovementMethod;

 7import android.widget.TextView;

 8

 9publicclass textViewDemoActivity extends Activity {

10

11     private TextView textView1,textView2;

12     public textViewDemoActivity() {

13        // TODOAuto-generated constructor stub

14    }   

15    @Override

16     protectedvoid onCreate(Bundle savedInstanceState) {

17        // TODOAuto-generated method stub

18        super.onCreate(savedInstanceState);

19        setContentView(R.layout.textviewdemo);

20        //通过Id获得两个TextView控件

21        textView1=(TextView)findViewById(R.id.textView1);

22        textView2=(TextView)findViewById(R.id.textView2);

23        

24        //设置需要显示的字符串

25        String html="<font color ='red'>Helloandroid</font><br/>";

26        html+="<font color='#0000ff'><big><i>Helloandroid</i></big></font><p>";

27        html+="<big><a href='http://www.baidu.com'>百度</a></big>";

28        //使用Html.fromHtml,把含HTML标签的字符串转换成可显示的文本样式

29        CharSequence charSequence=Html.fromHtml(html);

30        //通过setText给TextView赋值

31        textView1.setText(charSequence);

32        //设定一个点击的响应

33        textView1.setMovementMethod(LinkMovementMethod.getInstance());

34        

35        String text="我的URL:http://www.cnblogs.com/plokmju/\n";

36        text+="我的email:plokmju@sina.com\n";

37        text+="我的电话:+86 010-12345678";

38        //因为textView2中有autoLink=”all“的属性设定,所以会自动识别对应的连接,点击出发对应的Android程序

39        textView2.setText(text);

40     }

41

42 }


 显示效果:

3、TextView显示图片

在TextView中显示图片的例子,依然是使用HTML标签的方式定义样式,但是使用的是Html.fromHtml()的另外一个重载的静态方法,可以设定<img>标签中的图像资源。

static Spanned fromHtml(Stringsource,Html.ImageGetter imageGetter,Html.TagHandler tagHandler)

  对于这个方法,在imageGetter参数中设定<img>标签中的图像资源文件,tagHandler主要是为了处理Html类无法识别的html标签的情况,一般不会用上,传值为null即可。

  布局XML文件textvideforimg.xml代码: 

 1<?xml version="1.0"encoding="utf-8"?>

 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 3    android:layout_width="match_parent"

 4    android:layout_height="match_parent"

 5    android:orientation="vertical">

 6     <TextView

 7         android:id="@+id/textImg"

 8        android:layout_width="fill_parent"

 9        android:layout_height="match_parent"

10        android:layout_margin="10dp"/>

11</LinearLayout>

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<imgsrc='image1'/>图像2<img src='image2'/>\n";

33        html+="图像3<ahref='http://www,baidu.com'><img src='image3'/></a>";

34        //fromHtml中ImageGetter选择html中<img>的图片资源

35        CharSequence cs=Html.fromHtml(html, newImageGetter() {

36            

37            publicDrawable getDrawable(String source) {

38                 //source为html字符串中定义的<img>中的src的内容

39                 //返回值Drawable就是对应的<img>显示的图片资源

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<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 3    android:layout_width="match_parent"

 4    android:layout_height="match_parent"

 5    android:orientation="vertical">

 6     <TextView

 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     <TextView

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</LinearLayout>

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



第五章 用户界面基础(TextView的使用)的评论 (共 条)

分享到微博请遵守国家法律