E);
}
mContentView.addView(parent, viewIndex);
setImage(parent, mImage[index], mImageUrl[index]);
}
private void setImage(View parent, ImageView iv, String picUrl){
if(picUrl != null && picUrl.trim().length() > 0) {
parent.setVisibility(View.VISIBLE);
iv.setImageResource(R.drawable.weibo_pic_loading);
Size size = setPic(iv, picUrl);
if(size.getHeight() > 0 && size.getWidth() > 0) {
parent.requestLayout();
}
}
else{
parent.setVisibility(View.GONE);
}
}
private Size setPic(ImageView logoView, String logoUrl) { //异步加载图片代码略
return XXXFileManager.getInstance().setImageBitmapWithMemoryCache(
getContext(), logoView, logoUrl, XXXFileManager.getImagetLrucache(),
getContext().getClass().getName(), false);
}
/**
* 供图片下载完毕时调用
* @param fileURL
*/
public void setPic(String fileURL) {
if(mImage != null && mImageUrl != null && !TextUtils.isEmpty(fileURL)) {
String source = null;
for(int i = 0; i < mImageUrl.length && i < mImage.length; i++) {
source = mImageUrl[i];
if(!TextUtils.isEmpty(source)) {
if(fileURL.equals(source)) {
setPic(mImage[i], source);
mImage[i].getParent().requestLayout();
break;
}
}
}
}
}
/**
* 设置是否支持超链接点击
*/
public void setSupportMovementMethod(Boolean supportMovementMethod) {
this.supportMovementMethod = supportMovementMethod;
}
/**
* 设置是否显示图索引
* @param showImageIndex
*/
public void setShowImageIndex(Boolean showImageIndex) {
this.showImageIndex = showImageIndex;
}
/**
* 设置TextView超链接跳转
* @param tv
*/
private void changeLink(TextView tv){
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);
if(urls == null || urls.length <= 0) { return; }
SpannableStringBuilder style = new SpannableStringBuilder(text);
URLSpan[] urlsn = style.getSpans(0, end, URLSpan.class);
if(urlsn == null || urls.length != urlsn.length) { return; }
//循环把链接发过去
URLSpan url = null;
for(int i = 0; i < urls.length && i < urlsn.length; i++) {
url = urls[i];
MyURLSpan myURLSpan = new MyURLSpan(getContext(), url.getURL());
style.removeSpan(urlsn[i]);
style.setSpan(myURLSpan, sp.getSpanStart(url),
sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
}
tv.setText(style);
}
}
public int getImageCount() {
int cnt = mImageBaseIndex;
if(mImage != null && mImageUrl != null) {
cnt += mImage.length;
}
return cnt;
}
public void setmImageBaseIndex(int baseIndex) {
this.mImageBaseIndex = baseIndex;
}
public CharSequence getmData() {
return mData;
}
}
2.5 MyURLSpan.java:定义一个可点击的Span,点击超链接时通过
浏览器打开改网页/文件。
public class MyURLSpan extends ClickableSpan {
private Context context = null;
private String mUrl = null;;
public MyURLSpan(Context context,String url) {
this.context = context;
this.mUrl = url;
}
@Override
public void onClick(View widget) {
if (URLUtil.isNetworkUrl(mUrl)) {
XXXUtils.openMyWebBrowser(this.context,
this.context.getResources().getString(R.string.newstext_hyperlink),
this.mUrl);
}
}
}
3 使用简单,可以在xml文件中引用,也可以动态创建视图。
3.1 在xml中引用
……
……
3.2 java代码,设置显示内容
itvFreeContent = (MyImageTextView) this.findViewById(R.id.XXX_Content);
itvFreeContent.setSupportMovementMethod(true);
//itvFreeContent.setShowImageIndex(true);
itvFreeContent.setText(Html.fromHtml(formatContent(content)));
当然这里还需要加入图片异步下载完成后的代码,如:
private void initHandler() {
this.mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case KLoadImageOver:
itvFreeContent.setPic(msg.getData().getString("fileURL"));
break;
default:
break;
}
}
};
}
实际效果图(截取部分):

4 第二种方式需要扩展的是,如果显示的内容有超链接,且超链接时中的显示对象是图片,那么需要给图片增加点击事件,点击的跳转参照MyURLSpan.onClick。
关于图片的下载,这里推荐一个第三方库Android-Universal-Image-Loader。