Textview在日常开发工作中使用非常频繁,在这里简单总结一下其比较重要的用法。目标是设置textview的中一段文字的显示属性,例如指定文字要下划线显示(@XXX、#XXX#),文字替换成图片,文字加重、变色、变大等。
实现的基本思路都是将指定的文字找出来,然后用实现Spananble接口的子类覆盖,即可。
Spananble只是一个接口,它的继承关系是:Spananble->Spanned->CharSequence
因为Spannable继承于CharSequence接口,因而,TextView可以直接setText,Spannable的实现类:Editable, SpannableString, SpannableStringBuilder 。
Spannable中有提供public abstract void setSpan (Object what, int start, int end, int flags) 方法,来设置被替换部分要显示的样式
其中参数Object what 又必须是 android.text.style.CharacterStyle 的实现子类,就是它决定显示的样式,例如实现下划线的UrlSpan,实现改变字体颜色的ForegroundColorSpan,实现改变字体大小的AbsoluteSizeSpan,实现替换成图片的ImageSpan等。下面我会总结几种常用的用法:
1、改变文字的大小以及颜色:
String str = "This is testing text!" int start =str.indexOf("testing"); int end = start + "testing ".length(); SpannableStringBuilder style = new SpannableStringBuilder(str); int size = 20; //20px style.setSpan(new AbsoluteSizeSpan(size), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); int color = 0xff0000; //设置指定位置文字的颜色 style.setSpan(new ForegroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); ... textView.setText(style);
2、实现多字符串的动态处理:
string.xml: <string name="testing">这是一个数字:%1$d, 这是两位数字:%2$d,这又是成都为3的字符串:%3$s</string>
String text = String.format(getResources().getString(R.string.testing), 1, 22, "三个字"); int index[] = new int[3]; index[0] = text.indexOf("1"); index[1] = text.indexOf("22"); index[2] = text.indexOf("三个字"); SpannableStringBuilder style=new SpannableStringBuilder(text); style.setSpan(new ForegroundColorSpan(Color.RED),index[0],index[0]+1,Spannable.SPAN_EXCLUSIVE_INCLUSIVE); style.setSpan(new ForegroundColorSpan(Color.RED),index[1],index[1]+2,Spannable.SPAN_EXCLUSIVE_INCLUSIVE); style.setSpan(new BackgroundColorSpan(Color.RED),index[2],index[2]+3,Spannable.SPAN_EXCLUSIVE_INCLUSIVE); textView.setText(style);
在项目开发中,我们经常需要把多个字符串进行拼接,用上面的方式处理,并结合起来使用,可以避免很多Textview的拼接!
3、实现超链接效果:
第一种简单做法:当文字中出现URL、E-mail、电话号码等的时候,可以将TextView的android:autoLink属性设置为相应的的值,也可以是所有的类型都都响应:android:autoLink="all",最后在java代码里,对指定的textView.setAutoLinkMask(Linkify.ALL);
第二种自定义做法:尽管第一种做法简单,但都是默认调用,不能自定义跳转,像微博的@XXX ,#XXX#这类的特殊文字的响应,需要指定处理的视图。我们一般可以这样子实现:
(1)我们先指定特定字符串响应点击:
SpannableStringBuilder style = new SpannableStringBuilder("call: 110"); style.setSpan(new StyleSpan(Typeface.BOLD), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); style.setSpan(new URLSpan("110"), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); textView.setText(style); textView.setMovementMethod(LinkMovementMethod.getInstance());
(2)更改响应点击的方式:
URLSpan是我们常用的文字超链接控件,但是默认都会自带下划线,并不是太美观。有官方API文档可知,URLSpan继承自 ClickableSpan , 因而我们可以通过继承 ClickableSpan 并重写其实现的方法,即可实现自定义跳转控制,以及外观样式的控件了。
public class URLSpanNoUnderline extends ClickableSpan { private final String mURL; public URLSpanNoUnderline(String url) { mURL = url; } public String getURL() { return mURL; } @Override public void onClick(View widget) { Uri uri = (Uri) widget.getTag(); if(uri!=null) { final Context context = widget.getContext(); Intent intent = new Intent(Intent.ACTION_VIEW, uri); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()); context.startActivity(intent); } } @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setUnderlineText(false); //取消下划线 ds.setColor(0xff0066ff); //指定文字颜色 //ds.setTextSize(ds.getTextSize()*1.1F); } }
(3)实现响应:
我们通过设置Intent的Action---- Intent.ACTION_VIEW,并指定携带的Data是uri,那么我们就可以在程序中,实现响应该Action和Data意图的Activity:
<activity android:name=".activity.XXXActivity" android:configChanges="keyboardHidden|orientation" android:theme="@android:style/Theme.NoTitleBar" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="_host" android:scheme="_scheme" /> </intent-filter> </activity>
(4)最后是自定义Uri
uri一般由scheme和host,就像http的url一样,http://www.google.com,其scheme是http,host就是www.google.com,二者结合就可定位到某一位置。uri也一样,当然带参数也是可以的,例如:my_scheme://my_host?param=www.google.com。
总结一下,通过重写实现 ClickableSpan 接口,并自定义Uri,即可使其 响应 导向指定的activity进行。
未完待续...
本文由zhiweiofli编辑发布,转载请注明出处,谢谢。
相关推荐
TextView中使用Html,TextView实现走马灯效果
TextView使用HTML处理字体样式、显示图片等
android TextView android TextView
TextView 高级应用技巧,
最近在项目中使用textview时发现在使用Android:layout_height=”wrap_content”这个属性设置后,textview会有默认的padding,也就是fontpadding。这样就会造成textview和其他view中间的间距会比自己的设置的大。那么...
自定义TextView显示Gif,先使用GifDecoder将Gif文件解析成一张张图片,然后通过ImageSpan将图片显示在TextView中,定义一个线程不断刷新图片
关于android的TextView属性集合和详解
支持放大缩小的TextView 使用.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
通过textview设置状态选择
在TextView中添加图片的三种方式总结 1.使用SpannableString+ImageSpan 2.android:drawableBottom... 3。扩展TextView 复写onDraw
在TextView中长按可以复制textview的文本内容,经过验证,可以直接导入项目
有时候看到原型图上要求图片和文字对齐,但是直接使用TextView的话总是有一段空白,这里直接继承TextView重写onDraw方法去掉上下边距,但是简单粗暴,导致只能显示文字,没有TextView其他的功能了。
TextView的简单使用我们在第一个Android应用,hello OurAndroid中,其实已经用到了Textview这个控件了,我们在Android开发中一般会使用TextView来显示文本内容,这篇我将介绍一个使用布局文件控制的TextView。...
旋转TextView文字显示方向,可参考学习一下。
android TextView解决自动换行问题,设置行数后超过用省略号
android TextView 支持CSS样式
TextView上显示图片稀奇吧,我们的Launcher显示的应用图标以及下面显示的文字就是TextView这货干的,今天我们就来用TextView实现这一效果。详见文章:http://www.ourunix.org/android/post/122.html
就是一些简单的较少 关于Textview什么的啊
简单的textview 跑马灯效果 可直接使用
1、TextView使用ImageSpan显示图片 ImageSpan span = new ImageSpan(this, R.drawable.ic_launcher); SpannableString spanStr = new SpannableString("http://orgcent.com"); spanStr.setSpan(span, spanStr.length...