我有一个JSON字符串,它包含HTML标记和图像,如下所示:
<center>denn.. <span class="uicon" style="background-image:url(http://static.allmystery.de/images/lachen.gif);width:15px;height:14px;" title=":)">:)</span>
ich habe immer versucht ein <small>perfektionist</small> zu sein ohne das es mir klar war.<br><br>我试着用img src= "“标记替换笑脸,但是用ImageGetter.I加载它们很痛苦,我在毕加索和ImageSpans上都很成功。我的问题是,在我使用HTML.fromHtml(String)之后可以添加Imagespans吗?
如果重要的话,我想在EditText中显示所有内容。
编辑:
如果有人在EditText或TextViews中显示图像时遇到了同样的问题,那么这里是我解决这个恼人问题的方法:
SpannableString spannableString = new SpannableString(Html.fromHtml(text));
Pattern p = Pattern.compile(ADD REGEX TO FIND IMAGE URLS);
Matcher m = p.matcher(spannableString);
while (m.find()) {
//m.start() will give you the startlocation of the matched string
//m.end() does the same with the endlocation
//m.group(1) contains the imageurl which is captured with regex
//CustomTarget implements Target from Picasso (Imageloading library)
//holder.postText is the EditText or TextView
CustomTarget target = new CustomTarget(m.group(1), m.start(), m.end(), holder.postText, spannableString);
//add target to an ArrayList to keep a strong reference to prevent that the target gets garbage collected
// before the image is placed into the view
targets.add(target);
//load the image into the CustomTarget
Picasso picasso = Picasso.with(context);
picasso.setDebugging(true);
picasso.load(m.group(1)).into(target);
}CustomTarget类:
private class CustomTarget implements Target {
String url;
int start;
int end;
WeakReference<EditText> postText;
SpannableString rawText;
public CustomTarget(String url, int start, int end, EditText postText, SpannableString rawText) {
this.url = url;
this.start = start;
this.end = end;
this.postText = new WeakReference<>(postText);
this.rawText = rawText;
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
//get a weak Reference to the EditText because holder pattern in ListView will replace the View inside the holder before the Async Task is done
EditText editText = postText.get();
//Get existing ImageSpans to add them later again, if not, you will only get the last loaded image displayed
ImageSpan[] spans = editText.getText().getSpans(0, editText.length(), ImageSpan.class);
BitmapDrawable d = new BitmapDrawable(context.getResources(), bitmap);
d.setBounds(0, 0, d.getIntrinsicWidth()+5, d.getIntrinsicHeight()+5);
ImageSpan imageSpan = new ImageSpan( d, ImageSpan.ALIGN_BASELINE);
//add ImageSpan to the SpannableString
rawText.setSpan(imageSpan, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
//add previously added ImageSpans
if (spans.length >= 1) {
for (ImageSpan image: spans) {
rawText.setSpan(image, editText.getText().getSpanStart(image), editText.getText().getSpanEnd(image), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
}
}
//add the edited SpannableString to the EditText
editText.setText(rawText, TextView.BufferType.SPANNABLE);
//remove target from ArrayList to allow Garbage Collection
targets.remove(this);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
}注意:如果图像较大,您应该进行一些调整。
看上去如何:
http://i.imgur.com/Gr3WtyY.png
发布于 2014-06-05 21:56:03
要添加spans,需要一个Spannable实例。但是,Html.fromHtml()返回一个Spanned对象,该对象不提供此功能。
这是将标记对象附加到其范围的文本的接口。并不是所有的文本类都有可变的标记或文本;请参见“可修改的标记”和“可编辑的可变文本”。
但是,您可以很容易地从一个Spannable创建一个Spanned。只需使用:
SpannableString s = new SpannableString(Html.fromHtml("..."));https://stackoverflow.com/questions/24068753
复制相似问题