TextView高级
前言 开门见山,这一篇博客主要讲一下在Android开发中,UI控件TextView的一些使用方式,并且通过四个例子实现一般项目中需要的效果来讲解TextView的使用。并且在之后的一段时间之内,都会讲解关于AndroidUI控件的开发。 TextView 之前讲解Android布局的时候,就已经说明,所有Layout都是View的子类或者间接子类。而TextView也一样,是View的直接子类。它是一个文本显示控件,提供了基本的显示文本的功能,并且是大部分UI控件的父类,因为大部分UI控件都需要展示信息。 如果仅仅是展示文本,那么TextView的作用就太小了,所以它还预定义了一些类似于HTML的标签,通过这些标签可以使TextView控件显示不同的颜色、大小、字体、图片、链接。这些HTML标签都需要android.text.Html类的支持,但是并不包括所有的HTML标签。 常用的可以再TextView中设定的标签有: <font>:设置颜色和字体。
<big>:设置字体大号
<small>:设置字体小号
<i><b>:斜体粗体
<a>:连接网址
<img>:图片 使用这些标签可以用Html.fromHtml方法将这些标签的字符串转换成CharSequence接口,然后在TextView.setText()中进行设置。如果需要响应设置的HTML标签进行响应,需要设置TextView.setMovementMethod(LinkMovementMethod.getInstance())。 CharSequence为接口类型,大家可能对其有点陌生,但是它的子类肯定会让大家有熟悉的感觉,String、StringBuffer、StringBuilder、SpannableString、SpannableStringBuilder都是其子类,它包括了字符串的所有类,因为面向对象的多态性,在这里把他理解成字符串类的抽象即可。 除了使用HTML标签的方式设定显示文本中的URL地址、邮箱地址、电话等产生超链接出发相应的服务,可以使用android:autoLink属性来设置,以下是android:autoLink属性的介绍: None:默认的,不匹配任何连接。
web:网址。
email:邮箱。
phone:电话号码。
map:匹配映射网址。
all:匹配所有连接。 显示富文本 讲了这么多,通过第一个例子来讲解一下TextView使用HTML标签设定样式和通过autoLink属性来设置超链接效果,在XML布局文件中定义两个TextView,分别展示HTML标签和autoLink属性的使用。
textviewdemo.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="20sp" /> <TextView
android:id="@+id/textView2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:autoLink="all"
android:padding="20sp"
android:textSize="20sp" /> </LinearLayout>
MainActivity
package com.example.textview0; import android.app.Activity;
import android.os.Bundle;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.widget.TextView; public class MainActivity extends Activity {
private TextView textView1, textView2; public MainActivity() {
// TODO Auto-generated constructor stub
} @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.textviewdemo);
// 通过Id获得两个TextView控件
textView1 = (TextView) findViewById(R.id.textView1);
textView2 = (TextView) findViewById(R.id.textView2);
// 设置需要显示的字符串
String html = "<font color =’red’>Hello android</font><br/>";
html += "<font color=’#0000ff’><big><i>Hello android</i></big></font><p>";
html += "<big><a href=’http://www.baidu.com’>百度</a></big>";
// 使用Html.fromHtml,把含HTML标签的字符串转换成可显示的文本样式
CharSequence charSequence = Html.fromHtml(html);
// 通过setText给TextView赋值
textView1.setText(charSequence);
// 设定一个点击的响应
textView1.setMovementMethod(LinkMovementMethod.getInstance());
String text = "我的URL:http://www.cnblogs.com/plokmju/n";
text += "我的email:plokmju@sina.comn";
text += "我的电话:+010-12345678";
// 因为textView2中有autoLink="all“的属性设定,所以会自动识别对应的连接,点击出发对应的Android程序
textView2.setText(text);
}
}
显示效果:
TextView显示图片 第二个例子讲解一下在TextView中显示图片的例子,依然是使用HTML标签的方式定义样式,但是使用的是Html.fromHtml()的另外一个重载的静态方法,可以设定<img>标签中的图像资源。
static Spanned fromHtml(String source,Html.ImageGetter imageGetter,Html.TagHandler tagHandler)
对于这个方法,在imageGetter参数中设定<img>标签中的图像资源文件,tagHandler主要是为了处理Html类无法识别的html标签的情况,一般不会用上,传值为null即可。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/textImg"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_margin="10dp" /> </LinearLayout>
package com.example.textview0;
import java.lang.reflect.Field;
import android.R.color;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Html;
import android.text.Html.ImageGetter;
import android.text.method.LinkMovementMethod;
import android.widget.TextView; public class MainActivity extends Activity {
private TextView textViewImg; public MainActivity() {
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.textviewdemo); textViewImg = (TextView) findViewById(R.id.textImg);
textViewImg.setTextColor(color.white);
textViewImg.setBackgroundColor(color.black);
textViewImg.setTextSize();
// 设定HTML标签样式,图片3为一个超链接标签a
String html = "图像1<img src='image1'/>图像2<img src='image2'/>";
html += "图像3<a href='http://www,baidu.com'><img src='image2'/></a>";
// fromHtml中ImageGetter选择html中<img>的图片资源
CharSequence cs = Html.fromHtml(html, new ImageGetter() { public Drawable getDrawable(String source) {
// source为html字符串中定义的<img>中的src的内容
// 返回值Drawable就是对应的<img>显示的图片资源
Drawable draw = null;
if (source.equals("image1")) {
draw = getResources().getDrawable(R.drawable.image1);
draw.setBounds(, , draw.getIntrinsicWidth(),
draw.getIntrinsicHeight());
} else if (source.equals("image2")) {
// 设定image2尺寸等比缩小
draw = getResources().getDrawable(R.drawable.image2);
draw.setBounds(, , draw.getIntrinsicWidth() / ,
draw.getIntrinsicHeight() / );
} else {
// 使用反射会更简便,无需知道src与资源Id的对应关系
draw = getResources().getDrawable(getResourceId(source));
draw.setBounds(, , draw.getIntrinsicWidth(),
draw.getIntrinsicHeight());
}
return draw;
}
}, null);
textViewImg.setText(cs);
textViewImg.setMovementMethod(LinkMovementMethod.getInstance());
} public int getResourceId(String source) {
try {
// 使用反射机制,通过属性名称,得到其内的值
Field field = R.drawable.class.getField(source);
return Integer.parseInt(field.get(null).toString());
} catch (Exception e) {
// TODO: handle exception
}
return ;
}
}
效果截图,其中第三个图片点击会触发浏览器访问百度网址:
在TextView增加Click事件
第三个例子在TextView添加点击事件,导航到其他的Activity中。使用SpannableString.setSpan()设定那一段文本需要相应点击事件。与之类似的还有SpannableBuilder对象,他们的关系和String与StringBuilder一样。
void setSpan(Object what,int start,int end,int flags)
在what参数中传递一个抽象类ClickableSpan,需要实现其onClick()方法,此为指定文本的点击相应时间。start和end分别指定需要响应onClick()方法的文本开始与结束。flags设定一个标识,确定使用什么方式选择文本块,一般使用Spanned接口下的SPAN_EXCLUSIVE_EXCLUSIVE对其进行赋值,表示遵循设定的开始于结束位置的文本块。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/clickTextView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:textSize="30dp" />
</LinearLayout>
package com.example.textview0; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.View;
import android.widget.TextView; public class MainActivity extends Activity {
private TextView clickTextView1, clickTextView2; public MainActivity() {
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.textviewdemo);
clickTextView1 = (TextView) this.findViewById(R.id.clickTextView1);
String text1 = "显示Activity1";
// 使用SpannableString存放字符串
SpannableString spannableString = new SpannableString(text1);
// 通过setSpan设定文本块响应的点击事件
// 此处只设定文本的索引为2开始的文本块:Activity1
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
// 导航到一个新的 Activity1中
Intent intent = new Intent(MainActivity.this, Activity1.class);
startActivity(intent);
}
}, , , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 对TextView文本进行赋值
clickTextView1.setText(spannableString);
// 设置点击响应
clickTextView1.setMovementMethod(LinkMovementMethod.getInstance());
}
}
效果图,从图中可以看出只有点击setSpan中设定的代码块才可以触发点击事件:
跑马灯效果 说到文本显示,最常见的效果就是跑马灯效果,这里以一个例子展示跑马灯的效果,基本无需使用Java代码,在布局文件中设定各项属性就已经可以实现这个效果了。 在看代码前,先讲解一下等下会碰到的属性: android:elipsize: 如果文本长度大于TextView的显示长度,则隐藏那一部分,可赋值为:none(不隐藏)、start(隐藏开始)、middle(隐藏中间)、end(隐藏结束)、marquee(滚动效果)。
android:marqueRepeatLimit:设定需要重复动画的次数,传递一个int值,-1为无限循环。
android:focusable:是否允许获得焦点,传递一个bool值。
android:focusableInTouchMode:是否在获得焦点时对控件有联系,传递一个bool值。 介绍属性后,直接看代码吧,XML布局文件runlamp_layout.xml代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/tvRunLamp" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#FFF"
android:textColor="#000"
android:textSize="20dp"
android:layout_margin="10dp"
android:padding="10dp"/>
</LinearLayout>
package cn.bgxt.textviewdemo; import android.app.Activity;
import android.os.Bundle;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.widget.TextView; public class RunLampActivity extends Activity { private TextView tvRunLamp; public RunLampActivity() {
// TODO Auto-generated constructor stub
} @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.runlamp_layout); tvRunLamp = (TextView) findViewById(R.id.tvRunLamp);
String html = "之前讲解Android布局的时候,就已经说明,所有<a href='http://www.cnblogs.com/plokmju/p/androidUI_Layout.html'>Layout</a>都是View的子类或者间接子类。而TextView也一样,是View的直接子类。它是一个文本显示控件,提供了基本的显示文本的功能,并且是大部分UI控件的父类,因为大部分UI控件都需要展示信息。";
CharSequence cs = Html.fromHtml(html);
tvRunLamp.setText(cs);
//因为文本中设定了一个<a>标签,这里设置响应。
tvRunLamp.setMovementMethod(LinkMovementMethod.getInstance());
}
}
运行效果图,是一个滚动的效果:
总结
在此就说明了Android中TextView,并且以例子的方式说明了一些常用效果的实现。因为TextView是大部分UI控件的父类,所以其内的一些属性对于其他UI控件都是通用的,可以有借鉴的地方。
TextView高级的更多相关文章
- Android开发之TextView高级应用
Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...
- Android TextView高级特性使用
TextView一般都是用来显示一段文本,这里说的高级特性主要是一些我们平常不太常用的属性.包括文字阴影.自定义字体.html嵌入多格式.字体加粗.插入图片.这些特性平时开发APP的时候,可能一般使用 ...
- TextView使用大全
最近打算写一个系列的android初级开发教程,预计40篇以上的文章,结合我实际工作中的经验,写一些工作中经常用到的技术,让初学者可以少走弯路,写一个系列的话,大家学习起来也有头有尾. 今天就从我们每 ...
- Android开发之对话框高级应用
Android开发之对话框高级应用 创建并显示一个对话框非常easy.可是假设想进行一些更高级点的操作,就须要一些技巧了.以下将和大家分享一下对话框使用的一些高级技巧. 1.改变对话框的显示位置: 大 ...
- Python爬取CSDN博客文章
0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...
- Android开发之SpannableString具体解释
在实际的应用开发过程中常常会遇到.在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等. 普通情况下,TextView中的文本都是一个样式.对于类似的情况.能够 ...
- TextView的一些高级应用(自定义字体、显示多种颜色、添加阴影)
1. 自定义字体可以使用setTypeface(Typeface)方法来设置文本框内文本的字体,而android的Typeface又使用TTF字体文件来设置字体所以,我们可以在程序中放入TTF字 ...
- Android 高级UI设计笔记05:使用TextView实现跑马灯的效果
1. 使用TextView属性实现跑马灯的效果: (1). 新建一个Android工程,命名为"MarqueeTextViewDemo",如下: (2). 来到activity_m ...
- Android 高级编程 RecyclerView 控件的使用
RecyclerView 是Android 新添加的一个用来取代ListView的控件,它的灵活性与可替代性比listview更好. 看一下继承关系: ava.lang.Object ↳ and ...
随机推荐
- .Net Core添加分布式Session
一.Session HTTP是一个无状态协议,Web服务器将每一个请求都视为独立请求.并且不保存之前请求中用户的值. Session 状态是ASP.NET Core提供的一个功能,它可以在用户通应用访 ...
- 5.30获取openid和createTime--mybatis自动生成接口和映射【这里需要自定义】
自定义sql获取数据: dao: 前提是反向成了代码: A : 接口PhoneModelMapper extends IBaseMap ...
- 5.7 Liquibase:与具体数据库独立的追踪、管理和应用数据库Scheme变化的工具。-mybatis-generator将数据库表反向生成对应的实体类及基于mybatis的mapper接口和xml映射文件(类似代码生成器)
一. liquibase 使用说明 功能概述:通过xml文件规范化维护数据库表结构及初始化数据. 1.配置不同环境下的数据库信息 (1)创建不同环境的数据库. (2)在resource/liquiba ...
- 理解list和vector的区别
原文:http://genwoxuevc.blog.51cto.com/1852984/503337 vector和数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随机存取( ...
- HTML 5的基本标签
1. 文件开始标签<html> 在任何的一个HTML文件里,最先出现的HTML标签就是<html>,它用于表示该文件是以超文本标识语言(HTML)编写的.<html&g ...
- 【PostgreSQL-9.6.3】表继承
表继承是PostgreSQL特有的,子表可以从父表中继承字段和一些属性.例如: --创建一张表“persons”作为父表: test=# create table persons ( test(# i ...
- 【Oracle】体系结构
1. 理解实例和数据库 ☞ 实例是一组后台进程和共享内存 ☞ 数据库是磁盘上存储的数据集合 ☞ 实例“一生”只能装载并打开一个数据库 ☞ 数据库可以由一个或多个实例(RAC)装载和打开 [oracle ...
- Python3爬虫----爬取网页内的图片
无聊把公司内网爬了一遍. https://github.com/gig886/Python/tree/master/爬虫
- 安卓JNI使用C++类
安卓JNI使用C++类,同时可使用C++的类成员变量,这就必须保证程序持续保存Native状态,即长期维护C++对象的地址.完成初始化之后,需要使用对象成员的java层函数需要传入对象的地址. 一.N ...
- JNI传递字符串数组J-StringArray
编译器对语言的转换以寻地址的方式进行序列化和反序列化,因此对于不固定类型或者不显示给出大小的对象不能直接解析,所以没有出现jstringArray这样的类型,只能一个一个编写. 参考链接:安卓开发提高 ...