我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色

通过上一篇文章

我的Android进阶之旅------>
Android在TextView中显示图片方法

(地址:http://blog.csdn.net/ouyang_peng/article/details/46916963)

我们学会了在TextView中显示图片的方法,现在我们来学习如何为TextView组件中显示的文本添加背景色。要求完成的样子如图所示:

首先来学习使用BackgroundColorSpan对象设置文字背景色,代码如下:

                TextView textView=(TextView) findViewById(R.id.myTextView);
		//要显示的字符串
		String text="带背景色的文字";
		//将字符串转换为SpannableString对象
		SpannableString spannableString=new SpannableString(text);
		//确定要设置的字符串的start和end
		int start=0;
		int end=7;
		//创建BackgroundColorSpan对象,指定背景色为黄色
		BackgroundColorSpan backgroundColorSpan=new BackgroundColorSpan(Color.YELLOW);
		//使用setSpan方法将指定字符串转换成BackgroundColorSpan对象
		spannableString.setSpan(backgroundColorSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		//用SpannableString对象设置TextView
		textView.setText(spannableString);

BackgroundColorSpan只能设置文字的背景色,为了更加通用,自定义一个ColorSpan类,可以同时设置文字颜色和背景色,代码如下:

package com.oyp.edittext;

import android.text.TextPaint;
import android.text.style.CharacterStyle;

public class ColorSpan extends CharacterStyle {
	private int mTextColor;
	private int mBackgroundColor;

	public ColorSpan(int textColor,int backgroundColor){
		mTextColor=textColor;
		mBackgroundColor=backgroundColor;
	}
	//覆盖CharacterStyle类的updateDrawState方法
	//并在该方法中设置了文字和背景颜色
	@Override
	public void updateDrawState(TextPaint tp) {
		tp.bgColor=mBackgroundColor;
		tp.setColor(mTextColor);
	}
}

在ColorSpan类中实现了CharacterStyle的updateDrawState方法。该方法在系统开始绘制要设置样式的字符串之前调用,以便修改绘制文字的属性,例如:文字颜色、背景颜色等。其中TextPaint是Paint的子类。Paint类用于描述绘制的属性,如画笔的颜色、画笔的粗细等。现在我们同事使用BackgroundColorSpan和ColorSpan类设置文字和背景颜色,代码如下:

package com.oyp.edittext;

import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.BackgroundColorSpan;
import android.widget.TextView;
import android.app.Activity;
import android.graphics.Color;

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.oyp);

		TextView textView=(TextView) findViewById(R.id.myTextView);
		//要显示的字符串
		String text="<没有背景><黄色背景>\n\n<蓝色背景,红色文字>";
		//将字符串转换为SpannableString对象
		SpannableString spannableString=new SpannableString(text);
		//确定要设置的字符串的start和end
		int start=6;
		int end=12;
		//创建BackgroundColorSpan对象,指定背景色为黄色
		BackgroundColorSpan backgroundColorSpan=new BackgroundColorSpan(Color.YELLOW);
		//使用setSpan方法将指定字符串转换成BackgroundColorSpan对象
		spannableString.setSpan(backgroundColorSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		/**
		 * <蓝色背景,红色文字>  子字符串的开始位置(没一个"\n"算一个长度)
		 * 由于该子字符串再原字符串的最好,因此,end对于字符串的长度,也就是text.length()
		 */
		start=14;
		//创建ColorSpan对象
		ColorSpan colorSpan=new ColorSpan(Color.RED, Color.BLUE);
		//将指定文字转换成ColorSpan对象
		spannableString.setSpan(colorSpan, start, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		//用SpannableString对象设置TextView
		textView.setText(spannableString);
	}
}

oyp.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
    <TextView
            android:layout_width="wrap_content"
      		 android:layout_height="wrap_content"
      		 android:id="@+id/myTextView"
        />
</RelativeLayout>

程序运行效果如下图所示:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 00:07:17

我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色的相关文章

我的Android进阶之旅------&gt; Android在TextView中显示图片方法

面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用TextView组件可以显示富文本信息.在TextView组件中可以使用富文本标签来显示富文本信息,这种标签类似于HTML标签,但比HTML标签简单,支持有限的几种显示富文本的方式.如<font>标签用于设置字体和颜色,<b>用于设置粗体.包含这些标签的文本不能直接作为TextView.se

我的Android进阶之旅------&gt;Android疯狂连连看游戏的实现之实现游戏逻辑(五)

在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的初始化设置信息. GameService:负责游戏的逻辑实现. 其中GameConf的代码如下:cn\oyp\link\utils\GameConf.java package cn.oyp.link.utils; import android.content.Context; /** * 保存游戏配置的对象

我的Android进阶之旅------&gt;Android利用Sensor(传感器)实现水平仪功能的小例

这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端. 利用方向传感器返回的第一个参数,实现了一个指南针小应用. 我的Android进阶之旅------>Android利用Sensor(传感器)实现指南针功能 (地址:http://blog.csdn.net/ouyang_peng/article/details/8801204) 接下来,我们利用返回的第二.三个参数实现该水平仪.因为第二个参数,反映底部翘起的角度(当

我的Android进阶之旅------&gt;Android字符串资源中的单引号问题error: Apostrophe not preceded by 的解决办法

刚刚在string字符串资源文件中,写了一个单引号,报错了,错误代码如下 error: Apostrophe not preceded by \ (in OuyangPeng's blog ) 资源文件如下: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="ouyang">OuyangPeng's blog </string

我的Android进阶之旅------&gt;Android二级ListView列表的实现

实现如下图所示的二级列表效果 首先是在布局文件中,布局两个ListView,代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height=&

我的Android进阶之旅------&gt;Android嵌入图像InsetDrawable的用法

面试题:为一个充满整个屏幕的LinearLayout布局指定背景图,是否可以让背景图不充满屏幕?请用代码描述实现过程. 解决此题,可以使用嵌入(Inset)图像资源来指定图像,然后像使用普通图像资源一样使用嵌入图像资源. 语法如下: <?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android&

我的Android进阶之旅------&gt;Android使用AlarmManager全局定时器实现定时更换壁纸

该DEMO将会通过AlarmManager来周期的调用ChangeService,从而让系统实现定时更换壁纸的功能. 更换壁纸的API为android.app.WallpaperManager,它提供了clear()方法来清除壁纸,还提供了如下方法来设置壁纸. setResource(int resid)将壁纸设置为resid资源所代表的图片 setBitmap(Bitmap bitmap)将壁纸设置为bitmap所代表的位图 setStream(InputStream data)将壁纸设置为d

我的Android进阶之旅------&gt;Android中android:windowSoftInputMode的用法

面试题:如何在显示某个Activity时立即弹出软键盘? 答案:在AndroidManifest.xml文件中设置<activity>标签的android:windowSoftInputMode属性可以在显示Activity时立即弹出当前输入法的软键盘(不管是否有获得焦点的空间). 设置为:android:windowSoftInputMode="stateVisible|adjustPan"   代码如下: <activity android:name="

我的Android进阶之旅------&gt;Android中的布局优化 include、merge 、ViewStub

1.如何重用布局文件? 可以使用<include>标签引用其他的布局文件,并用android:id属性覆盖被引用布局文件中顶层节点的android:id属性值.代码如下: <!--引用mylayout.xml--> <include android:id="@+id/layout1" layout="@layout/mylayout"/> 2.减少视图层级<merge /> 无论布局文件的根节点是什么,系统都会在上一层