Android TextView中文字设置超链接、颜色、字体 大杂烩

TextView是用来显示文本的,有时需要给TextView中的个别字设置为超链接,或者设置个别字的颜色、字体等,那就需要用到Spannable对象,可以借助Spannable对象实现以上设置。 
效果图: 
 

Activity代码: 
Java代码   收藏代码
  1. package com.zhou.activity;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.Color;  
  5. import android.os.Bundle;  
  6. import android.text.Spannable;  
  7. import android.text.SpannableString;  
  8. import android.text.Spanned;  
  9. import android.text.method.LinkMovementMethod;  
  10. import android.text.style.BackgroundColorSpan;  
  11. import android.text.style.ForegroundColorSpan;  
  12. import android.text.style.StyleSpan;  
  13. import android.text.style.URLSpan;  
  14. import android.widget.TextView;  
  15.   
  16. public class TextViewLinkActivity extends Activity {  
  17.     TextView myTextView;  
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.main);  
  22.         myTextView = (TextView) this.findViewById(R.id.myTextView);  
  23.           
  24.         //创建一个 SpannableString对象  
  25.         SpannableString sp = new SpannableString("这句话中有百度超链接,有高亮显示,这样,或者这样,还有斜体.");  
  26.         //设置超链接  
  27.         sp.setSpan(new URLSpan("http://www.baidu.com"), 57,  
  28.                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  29.         //设置高亮样式一  
  30.         sp.setSpan(new BackgroundColorSpan(Color.RED), 17 ,19,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  31.         //设置高亮样式二  
  32.         sp.setSpan(new ForegroundColorSpan(Color.YELLOW),20,24,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);    
  33.         //设置斜体  
  34.         sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 2729, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);  
  35.         //SpannableString对象设置给TextView  
  36.         myTextView.setText(sp);  
  37.         //设置TextView可点击  
  38.         myTextView.setMovementMethod(LinkMovementMethod.getInstance());  
  39.     }  
  40. }  

Spannalbe文档:

Spannalbe
This is the interface for text to which markup objects can be attached and detached. Not all Spannable classes have mutable text; see Editable for that.

setSpan方法:

public abstract void setSpan (Object what, int start, int end, int flags)

Since: API Level 1
Attach the specified markup object to the range startend of the text, or move the object to that range if it was already attached elsewhere. See Spanned for an explanation of what the flags mean. The object can be one that has meaning only within your application, or it can be one that the text system will use to affect text display or behavior. Some noteworthy ones are the subclasses of CharacterStyle and ParagraphStyle, and TextWatcher and SpanWatcher.

http://developer.android.com/referenc...

android 如何让文本中某个关键字高亮显示?

TextView tv = (TextView) findViewById(R.id.hello);
SpannableString s = new SpannableString(getResources().getString(R.string.linkify));

Pattern p = Pattern.compile("abc");


Matcher m = p.matcher(s);

while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new ForegroundColorSpan(Color.RED), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
tv.setText(s);

或者:
SpannableStringBuilder style = new SpannableStringBuilder("test Height light");
//参数一:高亮颜色[ForegroundColorSpan前景色]
//from:高亮开始
//to:高亮结束
style.setSpan(new ForegroundColorSpan(color), from, to, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
(TextView)view.setText(style);

或者:

可以使用以下两种方法来实现:
1.用Html类的fromHtml()方法格式化要放到TextView里的文字。这种方法不仅能够高亮部分文字,而且还能够使用HTML里面方式来格式化文字,显示出各种效果。

    
    
  1. TextView.setText(Html.fromHtml("<font color=#FF0000>hello</font>"));

上述代码把hello设置成红色。
2.使用Spannable或实现它的类,如SpannableString。Spannable对象也可以实现一样的效果

   
    
    
  1. SpannableString ss = new SpannableString("abcdefgh");
  2. ss.setSpan(new BackgroundColorSpan(Color.RED), 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  3. TextView.setText(ss);

上述代码把[2,4)之间的字符设置成红色,也就是c和d。


1. 引言

 

     在Android中,使某个字符串中的某个单词或汉字高亮,效果图及代码实现如下。

 

2. 效果图

     高亮

3. 功能实现

 

    1. 主界面(main.xml)实现:

[java]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"  
  3.     android:orientation = "vertical"  
  4.     android:layout_width = "fill_parent"  
  5.     android:layout_height = "fill_parent"  
  6.     >  
  7.       
  8.     <TextView  
  9.         android:id = "@+id/highLight"  
  10.         android:layout_width = "wrap_content"  
  11.         android:layout_height = "wrap_content"  
  12.         />  
  13. </LinearLayout>   

 

    2. 主Activity实现:

[java]  view plain copy
  1. package com.focus.fishme;  
  2. import android.app.Activity;  
  3. import android.graphics.Color;  
  4. import android.os.Bundle;  
  5. import android.text.Spannable;  
  6. import android.text.SpannableStringBuilder;  
  7. import android.text.style.BackgroundColorSpan;  
  8. import android.widget.TextView;  
  9. public class HighLightActivity extends Activity {  
  10.       
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.main);  
  15.           
  16.         TextView highLightView = (TextView) findViewById(R.id.highLight);  
  17.           
  18.         String highLightStr = "HighLight MaYingCai";    
  19.         String highLight = "MaYingCai";    
  20.           
  21.         int start = highLightStr.indexOf(highLight);    
  22.           
  23.         SpannableStringBuilder style = new SpannableStringBuilder(highLightStr);    
  24.         style.setSpan(new BackgroundColorSpan(Color.RED), start, start + highLight.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  25.           
  26.         highLightView.setText(style);    
  27.     }  
  28.       
  29. }  


如何实现TextView中的某个字体改变颜色 (SDK3.0尚未验证可用性)

这几天一直在想这个问题 现在想问问大家 

请问想实现TextView中的某个字体改变颜色 有什么好的解决方法吗?

一个检索画面 检索出来的内容放在一个textView里面 想实现检索关键字改变颜色 像WebPage那样的

textView可以实现吗?

如果不可以 是否可以用webView来实现呢?

谢谢大家拉


已解决  不过程序里有黄色的警告!

NSString *detailtxt = @"<font color='#ff0000'>";
detailtxt = [detailtxt stringByAppendingString:strColor];
detailtxt = [detailtxt stringByAppendingString:@"</font>"];
detailtxt = [detailtxt stringByAppendingString:detail];
[textView setContentToHTMLString:detailtxt];

yakie2008-12-07 17:44
可以用webView来实现

具体参考代码例子。

superarts2008-12-07 18:00
webview里,做个字符串替换就好了,把KEYWORD改成<div color="xxx">KEYWORD</div>之类(HTML我不熟,大概意思吧)。

textview当然也可以做个关键字变颜色的子类。

cocoa20082008-12-08 12:12
谢谢楼上两位的回答

superarts :你说textView也可以做?不明白怎么做

superarts2008-12-08 13:47
写一个子类出来啊,好像是重写drawRect吧,勥人喜欢这么干,但是不才我只会用默认的控件而已。

如果写子类的话,大概的思路就是,根据rect和text,自己判断什么时候要换行,一个单词一个单词地写画上去;根据你的需要,要增加一个keyword属性,如果要画的单词等于keyword,就用另一种颜色画。

nerocoder2008-12-08 14:02
ms要自画, 定义好模板, 用正则替换

crazyazreal2008-12-08 15:38
明明用WebView会简单一点,非要重画?建议去看看html语法,用webview做 .

cocoa20082009-02-02 09:40
已解决
NSString *detailtxt = @"<font color='#ff0000'>";
detailtxt = [detailtxt stringByAppendingString:strColor];
detailtxt = [detailtxt stringByAppendingString:@"</font>"];
detailtxt = [detailtxt stringByAppendingString:detail];
[textView setContentToHTMLString:detailtxt];

alan2009-02-23 00:20
及时雨,我也刚好碰到这类问题。

lvyile2009-08-27 11:07
(SDK3.0尚未验证可用性)

bocol2009-08-27 11:17
Undocumented API了,还是webview吧,都是殊途同归的




EditText:

  通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢? 
记得android中有个android.text包,这里提供了对文本的强大的处理功能。 
添加图片主要用SpannableString和ImageSpan类:

     Drawable drawable = getResources().getDrawable(id);  
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  
        //需要处理的文本,[smile]是需要被替代的文本  
        SpannableString spannable = new SpannableString(getText().toString()+"[smile]");  
        //要让图片替代指定的文字就要用ImageSpan  
        ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);  
        //开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束(start和end)  
       //最后一个参数类似数学中的集合,[5,12)表示从5到12,包括5但不包括12  
        spannable.setSpan(span, getText().length(),getText().length()+"[smile]".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);    
        setText(spannable);  

将需要的文字高亮显示: 

public void highlight(int start,int end){  
        SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());//用于可变字符串  
        ForegroundColorSpan span=new ForegroundColorSpan(Color.RED);  
        spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        setText(spannable);  
    }  

加下划线: 

public void underline(int start,int end){  
        SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());  
        CharacterStyle span=new UnderlineSpan();  
        spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        setText(spannable);  
    }  

组合运用:

SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());  
        CharacterStyle span_1=new StyleSpan(android.graphics.Typeface.ITALIC);  
        CharacterStyle span_2=new ForegroundColorSpan(Color.RED);  
        spannable.setSpan(span_1, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        spannable.setSpan(span_2, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        setText(spannable);  

案例:带有\n换行符的字符串都可以用此方法显示2种颜色

    /** 
     * 带有\n换行符的字符串都可以用此方法显示2种颜色 
     * @param text 
     * @param color1 
     * @param color2 
     * @return 
     */  
    public SpannableStringBuilder highlight(String text,int color1,int color2,int fontSize){  
        SpannableStringBuilder spannable=new SpannableStringBuilder(text);//用于可变字符串  
        CharacterStyle span_0=null,span_1=null,span_2;  
        int end=text.indexOf("\n");  
        if(end==-1){//如果没有换行符就使用第一种颜色显示  
            span_0=new ForegroundColorSpan(color1);  
            spannable.setSpan(span_0, 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        }else{  
            span_0=new ForegroundColorSpan(color1);  
            span_1=new ForegroundColorSpan(color2);  
            spannable.setSpan(span_0, 0, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
            spannable.setSpan(span_1, end+1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
              
            span_2=new AbsoluteSizeSpan(fontSize);//字体大小  
            spannable.setSpan(span_2, end+1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        }  
        return spannable;  
    }  

以上实际都是Html.fromHtml(html)的代码实现形式。

=============================================================================

TextView: (方法与EditView类似)

如何让一个TextView中的关键字高亮显示? 

复制代码
    
    
/** * 关键字高亮显示 * @param target 需要高亮的关键字 */ public void highlight(String target){ String temp = getText().toString(); SpannableStringBuilder spannable = new SpannableStringBuilder(temp); CharacterStyle span = null ; Pattern p = Pattern.compile(target); Matcher m = p.matcher(temp); while (m.find()) { span = new ForegroundColorSpan(Color.RED); // 需要重复!
//span = new ImageSpan(drawable,ImageSpan.XX);//设置现在图片 spannable.setSpan(span, m.start(), m.end(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } setText(spannable); }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值