TextView的日常使用技巧

本文详细介绍了TextView中文字样式设置与动态处理的技术,包括改变文字大小与颜色、实现多字符串动态处理、以及实现超链接效果。通过使用Spannable接口及其实现类,如AbsoluteSizeSpan、ForegroundColorSpan、ImageSpan等,可以灵活地调整TextView内文字的显示属性。同时,通过自定义跳转方式,实现场景中不同需求的超链接效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、改变文字的大小以及颜色:
Java代码 收藏代码

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、实现多字符串的动态处理:

Xml代码 收藏代码
string.xml:
这是一个数字:%1 d , 这是两位数字: d, 这是两位数字:%2 d,这是两位数字:d,这又是成都为3的字符串:%3$s
Java代码 收藏代码

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)我们先指定特定字符串响应点击:
Java代码 收藏代码

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 并重写其实现的方法,即可实现自定义跳转控制,以及外观样式的控件了。
Java代码 收藏代码

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:
Xml代码 收藏代码

      <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进行。
未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈振阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值