`

Android在文本中添加超链接 (TextView)

 
阅读更多

在TextView中使用超级连接有几种方式:
1.在属性中设置:

<TextView 
android:id="@+id/testweb" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:autoLink="web" //是将文本的web网址解释成超链接
  android:text="@string/link_text_auto"
  />

autoLink:一共有几种值:web,phone,map,email.all.none.

分别是url连接。电话号码提取拨号,地图地址。电子邮件,全部解释就是能支持的超级连接全部起作用,
none就是默认情况,没有超链接。

2.使用html文本:
例如:
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="link_text_manual"> 
  a <a href="http://www.google.com">link</a> specified
   via an <a> tag. Use a \"tel:\" URL
   to <a href="tel:4155551212">dial a phone number</a>.
  </string>
</resources>


<TextView 
android:id="@+id/testemail" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:text="@string/link_text_manual"
  />

3.在java代码中添加超级连接:
TextView t = (TextView) findViewById(R.id.text3);
t.setText(
Html.fromHtml(
 "<b>text3:</b> Text with a " +
 "<a href=\"http://www.google.com\">link</a> " +
 "created in the Java source code using HTML."));
t.setMovementMethod(LinkMovementMethod.getInstance());

使用:SpannableString
SpannableString ss = new SpannableString("Click here to dial the phone.");
ss.setSpan(new StyleSpan(Typeface.BOLD), 0, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new URLSpan("tel:4155551212"), 13, 17, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView t = (TextView) findViewById(R.id.text4);
t.setText(ss);
t.setMovementMethod(LinkMovementMethod.getInstance());

二、TextView显示html文件中的图片

转javaeye:http://da-en.javaeye.com/blog/712415

我们知道要让TextView解析和显示Html代码。可以使用
Spanned text = Html.fromHtml(source);
tv.setText(text);
来实现,这个用起来简单方便。
但是,怎样让TextView也显示Html中<image>节点的图像呢?

我们可以看到fromHtml还有另一个重构:
fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler)

实现一下ImageGetter就可以让图片显示了:
ImageGetter imgGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable drawable = null;
drawable = Drawable.createFromPath(source); // Or fetch it from the URL
// Important
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable
.getIntrinsicHeight());
return drawable;
}
};

至于TagHandler,我们这里不需要使用,可以直接传null。
参考文档:
http://tech-droid.blogspot.com/2010/06/textview-with-html-content.html英语好的朋友就直接看英文文档吧。

三、Android---文字中插入表情

转载自:http://blog.163.com/spf9190@126/blog/static/50207531201091545954587/

这段时间在做一个短信项目,需要实现短信中插入表情的功能,本一位非常困难,经过一段时间的研究,发现还是比较簡単的,现在总结如下。

以短信输入框为例,短信的输入框是一个EditText,它的append方法不仅可以加入字符串,还可以添加HTML标记。以下就是使用HTML标记添加表情的具体操作。

首先需要构建一个ImageGetter,作用是通过HTML标记获得对应在res目录下的图片:

ImageGetter imageGetter = new ImageGetter() {
@Override
public Drawable getDrawable(String source) {
int id = Integer.parseInt(source);

//根据id从资源文件中获取图片对象
Drawable d = getResources().getDrawable(id);
d.setBounds(0, 0, d.getIntrinsicWidth(),d.getIntrinsicHeight());
return d;
}
};

然后就可以直接往EditText视图中添加

inputLable.append(Html.fromHtml("<img src='"+clickedImageId+"'/>", imageGetter, null));

其中Html.fromHtml("<img src='"+clickedImageId+"'/>"就是HTML的图片标记,在Android中支持了部分HTML标记的使用(这方面我还在继续研究),HTML标记必须被Html.fromHtml修饰。imageGetter即为之前创建的ImageGetter类型的对象。

很简单的几句代码就解决了问题,不仅在EditText中,在TextView中同样可以这样插入图片。

效果图:

四、android 短信字符转表情显示过程
android的短信实现方式普通用户适应的话需要长时间的使用才能习惯,将andorid的短信模式设置成我们常用的(一般人用户)的习惯。在查看字符转图片的过程中可以猜测出腾讯的QQ表情的原理应该是一样的只是在传送非常用的表情时是将byte数据转换为image.

以下代码摘录至android源码里面的MMS项目,其中的

package com.android.mms.ui 里的MessageListItem.java

package com.android.mms.util 里的SmileyParser.java

/***
*
*
此方法描述的是:注意此方法在做表情转换的准备了

* @author:wujun@cqghong.com,ppwuyi@sohu.com
* @version: 2010-5-13
下午03:31:13
*/
private void bindCommonMessage(final MessageItem msgItem) {
if (mDownloadButton != null) {
mDownloadButton.setVisibility(View.GONE);
mDownloadingLabel.setVisibility(View.GONE);
}
// Since the message text should be concatenated with the sender's
// address(or name), I have to display it here instead of
// displaying it by the Presenter.
mBodyTextView.setTransformationMethod(HideReturnsTransformationMethod.getInstance());

// Get and/or lazily set the formatted message from/on the
// MessageItem. Because the MessageItem instances come from a
// cache (currently of size ~50), the hit rate on avoiding the
// expensive formatMessage() call is very high.
CharSequence formattedMessage = msgItem.getCachedFormattedMessage();
if (formattedMessage == null) { //
肯定为null应为msgItem.formattedMessage从诞生来就没被注意过一次

formattedMessage = formatMessage(msgItem.mContact, msgItem.mBody, //
重点到了
msgItem.mSubject, msgItem.mTimestamp,
msgItem.mHighlight);
msgItem.setCachedFormattedMessage(formattedMessage);
}
mBodyTextView.setText(formattedMessage);

if (msgItem.isSms()) {
hideMmsViewIfNeeded();
} else {
Presenter presenter = PresenterFactory.getPresenter(
"MmsThumbnailPresenter", mContext,
this, msgItem.mSlideshow);
presenter.present();

if (msgItem.mAttachmentType != WorkingMessage.TEXT) {
inflateMmsView();
mMmsView.setVisibility(View.VISIBLE);
setOnClickListener(msgItem);
drawPlaybackButton(msgItem);
} else {
hideMmsViewIfNeeded();
}
}

drawLeftStatusIndicator(msgItem.mBoxId);
drawRightStatusIndicator(msgItem);
}
//------------------------------------------------------------------------------

/***
*
*
此方法描述的是:开始转换了哦

* @author:wujun@cqghong.com,ppwuyi@sohu.com
* @version: 2010-5-13
下午03:32:52
*/
private CharSequence formatMessage(String contact, String body, String subject,
String timestamp, String highlight) {
CharSequence template = mContext.getResources().getText(R.string.name_colon); //
遇到鬼了 &lt;主题:
<xliff:g id="SUBJECT">%s</xliff:g>&gt;"
SpannableStringBuilder buf = //
把他当作StringBuffer只是它可以放的不是String而已他能放跟多类型的东西

new SpannableStringBuilder(TextUtils.replace(template,
new String[] { "%s" },
new CharSequence[] { contact })); //
替换成联系人

boolean hasSubject = !TextUtils.isEmpty(subject); //主题
if (hasSubject) {
buf.append(mContext.getResources().getString(R.string.inline_subject, subject)); //buff
先在是 联系人 主题XXXX eg wuyi <主题:dsadasdsa>我爱我家
}

if (!TextUtils.isEmpty(body)) {
if (hasSubject) {
buf.append(" - "); //
如果内容有主题有就+ " - " eg wuyi <主题
:sdsadsadsa> -
}
SmileyParser parser = SmileyParser.getInstance(); //
获得表情类了哦

buf.append(parser.addSmileySpans(body)); //
追查 急切关注中
}
if (!TextUtils.isEmpty(timestamp)) {
buf.append("\n");
int startOffset = buf.length();

// put a one pixel high spacer line between the message and the time stamp as requested
// by the spec.
//
把之间的信息和时间戳的要求间隔一个像素的高线

//
由规范
buf.append("\n");
buf.setSpan(new AbsoluteSizeSpan(3), startOffset, buf.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

startOffset = buf.length();
buf.append(timestamp);
buf.setSpan(new AbsoluteSizeSpan(12), startOffset, buf.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// Make the timestamp text not as dark
改变某区域颜色时间的地方为特殊颜色

int color = mContext.getResources().getColor(R.color.timestamp_color);
buf.setSpan(new ForegroundColorSpan(color), startOffset, buf.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if (highlight != null) {
int highlightLen = highlight.length();

String s = buf.toString().toLowerCase();
int prev = 0;
while (true) {
int index = s.indexOf(highlight, prev);
if (index == -1) {
break;
}
buf.setSpan(new StyleSpan(Typeface.BOLD), index, index + highlightLen, 0);
prev = index + highlightLen;
}
}
return buf;
}

//------------------------------------------------------------

/**
* Adds ImageSpans to a CharSequence that replace textual emoticons such
* as :-) with a graphical version.
*
* @param text A CharSequence possibly containing emoticons
* @return A CharSequence annotated with ImageSpans covering any
* recognized emoticons.
*
添加ImageSpans一个CharSequence的表情符号代替文字等 *如用图形版本:-)

*
核心是把表情字符替换成ImageSpans的对象
*/
public CharSequence addSmileySpans(CharSequence text) {
SpannableStringBuilder builder = new SpannableStringBuilder(text);

Matcher matcher = mPattern.matcher(text);
while (matcher.find()) {
int resId = mSmileyToRes.get(matcher.group());
//
注意下面的一块有点不好理解哦但是是核心

builder.setSpan(new ImageSpan(mContext, resId), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}

return builder;
}

总结:

android在将字符转化为表情图像其核心代码为

builder.setSpan(new ImageSpan(mContext, resId), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
原理过程是先匹配到表情字符然后通过new ImageSpan(上下文,表情地址)绘制出一个ImageView然后替换掉表情字符。


五、

Android TextView 支持的HTML标签

  • <a href="...">
  • <b>
  • <big>
  • <blockquote>
  • <br>
  • <cite>
  • <dfn>
  • <div align="...">
  • <em>
  • <font size="..." color="..." face="...">
  • <h1>
  • <h2>
  • <h3>
  • <h4>
  • <h5>
  • <h6>
  • <i>
  • <img src="...">
  • <p>
  • <small>
  • <strike>
  • <strong>
  • <sub>
  • <sup>
  • <tt>
  • <u>


分享到:
评论

相关推荐

    Android TextView添加超链接的方法示例

    主要介绍了Android TextView添加超链接的方法,结合实例形式分析了TextView控件添加HTML超链接的实现技巧,需要的朋友可以参考下

    Android如何通过TextView实现超链接的跳转

    本示例代码为博客代码:博客地址为:http://blog.csdn.net/zhangjinhuang/article/details/52416608

    WebView跳转TextView中的超链接

    WebView跳转TextView中的超链接,支持多行链接,可以实现一行文本显示多个链接

    Android实现捕获TextView超链接的方法

    主要介绍了Android实现捕获TextView超链接的方法,涉及Android查找TextView中超链接的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    Android使用TextView实现无下划线超链接的方法

    和HTML中的一样,默认超链接都带下划线的,下面的方案可以在TextView中去掉超链接的下划线: 1、重写ClickableSpan类来去掉下划线样式(系统默认使用ClickableSpan来封装超链接) //无下划线超链接,使用...

    Android开发实现TextView超链接5种方式源码实例

    Android实现TextView超链接一共有五...一般情况下我们设置为all即可,我们看看,这个时候它就会自动将TextView中的电话号码、邮件地址、网页链接等识别出来,这中方式是最简单的一种。如: &lt;TextView android:layo

    Android中Textview超链接实现方式

    TextView中的超链接可以通过几种方式实现: 一、Html.fromHtml方式 TextView,本身就支持部分的Html格式标签。这其中包括常用的字体大小颜色设置,文本链接等。使用起来也比较方便,只需要使用Html类转换一下即可: ...

    Android SpannableString设置超链接、颜色、字体等属性

    在Android中,TextView是我们最常用的用来显示文本的控件。  一般情况下,TextView中的文本都是一个样式。那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们...

    textview网页链接

    安卓的textview中的文本链接网页 有兴趣的看看啊

    Android中TextView自动识别url且实现点击跳转

    主要介绍了关于Android中TextView自动识别url且实现点击跳转的相关资料,文中给出了详细的示例代码,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。

    Android中TextView实现部分文字可点击跳转

    主要为大家详细介绍了Android中TextView实现部分文字可点击跳转的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    android UI TextView

    基本TextView控件的应用,包括TextView各种属性的设置,特殊的效果的TextView,如带边框的TextView各种实现方法,走马灯,垂直滚动,自动垂直滚动,歌词显示效果,超链接,Html标签在TextView中的应用等。

    20多种TextView文字效果例子.zip

    在Android中,TextView是我们最常用的用来显示文本的控件。一般情况下,TextView中的文本都是一个样式。那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过...

    Android TextView中文本点击文字跳转 (代码简单)

    在web页面中,有a标签的超链接实现跳转,同样在Android当中,用TextView控件来显示文字,实现它的事件来跳转。 用过微博Android手机端的朋友的都知道微博正文有时有一些高亮显示的文本,如话题、提到的人等等,当...

    android:TextView简单设置文本样式和超链接的方法

    本文实例讲述了android:TextView简单设置文本样式和超链接的方法。分享给大家供大家参考,具体如下: 设置TextView中文本的样式(如:颜色、斜体等),可以针对不同位置的文本设置不同的样式(如:将索引范围在1-3的...

    简单学习Android TextView

    android:autoLink 用于指定是否将文本转换成可点击的超链接形式,它的属性值有none,web,email,phone,map或all android:drawBottom 用于将图片添加到文本的低端 同理还有上,左,右 android:hint 当文本为空时,...

    iOS 自定义视图:《用户协议及隐私政策》弹框(包含超链接属性)【demo源码支持中英文切换】

    1、自定义TextView,采用富文本属性进行内容设置attributedText(包括下划线NSUnderlineStyleSingle、超链接NSLinkAttributeName 、颜色NSForegroundColorAttributeName 等信息) 2、实现代理方法textView:...

    Android开发EditText属性.txt

    TextView中设置后无效果。  android:shadowColor指定文本阴影的颜色,需要与shadowRadius一起使用。效果: android:shadowDx设置阴影横向坐标开始位置。  android:shadowDy设置阴影纵向坐标开始位置。  ...

    Android-这个项目可以快速的帮你构建Textview中的内容

    这个项目可以快速的帮你构建Textview中的内容,如字体颜色,字体背景,样式,删除线,下滑线,文本超链接,文本跳转电话,文本跳转短信,文字中嵌入图片等功能

Global site tag (gtag.js) - Google Analytics