DreamSea

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

我的html文件是

<p>

    <font size="4"><b>

    If you do not hava a user name and password please contact

    your sales representative. If you've forget your login infomation

    or require assistance please email 

    <a href="mailto:support@tpinformation.com">support@tpinformation.com</a>

    or contact our help desk.

    <br/>

    <br/>

    </b></font>

</p>

<p>

     <font size="3"><b>

     EMEA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +44(0)5764 3344 22333<br/>

     Americas&nbsp; &nbsp; +1800 564 7667<br/>

     China&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +88 9 4848 39844<br/>

     <br/> 

     </b></font>

</p>

设置TextView 的URL链接地址颜色以及触发事件方法

 public void setTextViewHtmlLink(TextView tv , String assertHtmlFile){

    String htmltxt =  null;

        try{

if (htmltxt == null) {

InputStream is = this.getAssets().open(assertHtmlFile,AssetManager.ACCESS_BUFFER);

htmltxt = new String(Util.IS2ByteArray(is));

}

tv.setText(Html.fromHtml(htmltxt));

tv.setMovementMethod(LinkMovementMethod.getInstance());  

CharSequence text  =  tv.getText();     

        if (text instanceof Spannable){     

            int  end  =  text.length();     

           Spannable sp  =  (Spannable)tv.getText();     

           URLSpan[] urls = sp.getSpans( 0 , end, URLSpan.class );      

           SpannableStringBuilder style = new  SpannableStringBuilder(text);     

           style.clearSpans(); // should clear old spans      

            for (URLSpan url : urls){     

               MyURLSpan myURLSpan  =   new  MyURLSpan(url.getURL());             

               style.setSpan(myURLSpan,sp.getSpanStart(url),sp.getSpanEnd(url),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

               style.setSpan(new ForegroundColorSpan(Color.rgb(244, 115, 33)), sp.getSpanStart(url),sp.getSpanEnd(url),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

               // style.setSpan(new BackgroundColorSpan(Color.rgb(244, 115, 33)), sp.getSpanStart(url),sp.getSpanEnd(url),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

            }     

            tv.setText(style);     

       }     

}catch(Exception e){

tv.setText("");

}

    }

private  class MyURLSpan extends ClickableSpan {

  private String mUrl;

  MyURLSpan(String url) {

   mUrl = url;

  }

  @Override

  public void onClick(View widget) {

  // Toast.makeText(LoginActivity.this, mUrl, Toast.LENGTH_LONG).show();

   //send intent

  // widget.setBackgroundColor(Color.parseColor("#00000000"));

   Intent sendIntent = new Intent(Intent.ACTION_SEND);

   sendIntent.setType("text/html");

   sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{mUrl}); 

sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Get the Tullett Support");

LoginActivity.this.startActivity(Intent.createChooser(sendIntent, "Email via:"));

  }

}

不知道为什么tv.setMovementMethod(LinkMovementMethod.getInstance());  没有这句话,url颜色不变,触发事件也没有。

查了下,android的textview是支持混排的,比如下面这样, text是一个TextView

String str = "someone:  hi, ^O^";
SpannableStringBuilder style = new SpannableStringBuilder(str);
style.setSpan(new StyleSpan(Typeface.BOLD), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.setText(style, TextView.BufferType.SPANNABLE);

当我觉得很简单时,测试时发现杯具了,英文没问题,但是当要粗体的是中文时,就不起作用了。

google了下,发现android的中文加粗是要用下面的方法 T_T 

text.getPaint().setFakeBoldText(true);

但是这个是对整个TextView起作用的,所以全变粗了!

于是,我想出一个比较狗的办法:

搞2个TextView, 一个是粗体的文字TextView A,然后一个是全部文字 TextView B。然后把A叠加在B之上。而且,对于B的,要需要粗体那部分文字单独设成透明的颜色。这样做的目的,是用透明的文字把左边的间距顶出来,否则算这个padding也很麻烦。

所以搞算法和学术可以阳春白雪,搞工程有时不得不整奇技淫巧啊。手脏好干活啊,谁让咱们是IT民工呢 ^O^
还有相关的类 如 Linkfy ScrollingMovementMethod

posted on 2011-08-22 15:41  DreamSea  阅读(1593)  评论(0编辑  收藏  举报