专栏首页老欧说安卓Android开发笔记(六)可变字符串

Android开发笔记(六)可变字符串

Andorid的文本显示

在android的TextView控件上显示文本使用setText函数,包括继承自TextView的其他控件如Button、CheckBox、EditText、RadioButton等等,setText之后,我们还可以使用setTextColor设置文本的颜色,使用setTextSize设置文本的大小,使用setTextAlignment设置文本的对齐方式,还可以使用setTextAppearance设置文本的各个属性(包括颜色、大小、风格)。但是这样只能对控件上的所有文本做统一设置,如果我们想对前一段文本加大加粗,对中间一段文本显示红色,再对后面一段文本加超链接,那就要另外想办法了。幸好android为我们提供了可变字符串SpannableString,允许对文本分段显示。

SpannableString应用

SpannableString允许对其中一段字串分别设置不同的风格,各种风格的源码在android源码包里的android.text.style居然有三十几个,看来是没法全部掌握了。那还是挑几个常用的来练练手,针对上面说的三段文本分别显示来分别处理。   首先创建一个可变字符串

String itemText = "Hello world. "
SpannableString spanText = new SpannableString("Hello world. ");

  第一段文本改变文字大小采用RelativeSizeSpan,加粗采用StyleSpan,代码如下:

		spanText.setSpan(new RelativeSizeSpan(1.5f) , 0, first_length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		spanText.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, first_length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

上面setSpan第一个参数代表设置的风格对象,第二个参数代表该段文本的起始位置,第三个参数代表该段文本的结束位置,第四个参数用来标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果(主要对EditText有用)。分别有SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、SPAN_INCLUSIVE_INCLUSIVE(前后都包括)。   第二段文本改变文字大小也采用RelativeSizeSpan,改变颜色采用ForegroundColorSpan,代码如下:

		spanText.setSpan(new RelativeSizeSpan(0.75f), first_length+1, second_length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		spanText.setSpan(new ForegroundColorSpan(Color.RED), first_length+1, second_length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

  第三段代码加超链接稍微复杂些,因为要显示超链的下划线,并且在点击时还要跳转到指定的url地址,这里我们要继承URLSpan重写一个类

	private static class MyURLSpan extends URLSpan {
		public MyURLSpan(String url) {
			super(url);
		}


		@Override
		public void onClick(View widget) {
			System.out.println("MyURLSpan onClick");
			String url = "http://blog.csdn.net/aqi00";
			wv_go.loadUrl(url);
			wv_go.requestFocus();
			wv_go.setWebViewClient(new WebViewClient());
			return;
		}
	}


		String str_url = "Let's go.";
		Spannable sp = (Spannable) Html.fromHtml("<a href=\"\">"+str_url+"</a>");
		CharSequence text = sp.toString();
		URLSpan[] urls = sp.getSpans(0, text.length(), URLSpan.class);
		for (URLSpan url : urls) {
			MyURLSpan myURLSpan = new MyURLSpan(url.getURL());
			spanText.setSpan(myURLSpan, second_length+1, itemText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		}

最后往控件中填入该可变字符串

tv_hello.setText(spanText);

显示效果截图如下

点击这里下载本文可变字符串的例子代码

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android开发笔记(八十六)几个特殊的类

    interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供。Android对接口的使用场景...

    用户4464237
  • Android开发笔记(一百零一)滑出式菜单

    滑出式菜单从界面上看,像极了一个水平滚动视图HorizontalScrollView,当然也可以使用HorizontalScrollView来实现侧滑菜单。...

    用户4464237
  • 《Android Studio开发实战 从零基础到App上线》第一版的资源下载和内容勘误

    下面是《Android Studio开发实战 从零基础到App上线》(第一版)一书用到的工具和代码资源: 1、本书使用的Android Studio版本为2....

    用户4464237
  • Linux下批量管理工具pssh使用记录

    pssh是一款开源的软件,使用python实现,用于批量ssh操作大批量机器;pssh是一个可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出...

    洗尽了浮华
  • Linux系统rsync实战操作

    前面介绍了一些关于rsync的功能与一些具体的命令格式、参数的使用意义等,今天我们来聊一聊整个实际生产过程中的实战操作过程

    民工哥
  • 移动端IM系统的协议选型:UDP还是TCP?

    对于有过网络编程经验的开发者来说,使用何种数据传输层协议来实现数据的通信,是个非常基础的问题,它涉及到你的第一行代码�该如何编写。

    JackJiang
  • K8S Dashboard 2.0 部署并使用 Ingress-Nginx 提供访问入口

    Kubernetes Dashboard 终于发布 2.0 正式版本,从 Betat版本 到 v2.0.0正式版本 发布,历时一年多。

    YP小站
  • 后台查找CDSW中用户的审计日志

    在前面的文章Fayson介绍了很多关于CDSW安装以及使用的文章,对于CDSW平台服务的架构Fayson的理解是有多个Docker提供服务(类似于现在的微服务)...

    Fayson
  • Express新手入坑笔记之Handlebars模板继承

    将views文件夹下, index.html内的内容精简(只保留关键内容body)

    zhaoolee
  • 小白如何从零开始安装Discuz! Q内测版

    首先强调一点:当前Discuz! Q还是很早期的版本,主要是面向开发者,让开发者提前介入模板和插件的开发。或者有经验的站长,作为早期体验和选型。 但如果是不...

    腾讯云DNSPod团队

扫码关注云+社区

领取腾讯云代金券