前几天在做一个Gradle用户指南的应用程序,使用的是TextView来加载HTML内容(至于为什么不用WebView,我也没有认真使用并比较过,也许以后会换吧),其中遇见了一些纠结的问题,所幸主要的问题都一一解决了。

下面说一下遇见的几个问题及我的解决方法。

TextView异步加载HTML中的图片及图文重叠

在TextView中加载HTML图片,需要实现Html.ImageGetter接口,然后在public Drawable getDrawable(String source)中去获取图片。图片获取我是直接使用了ImageLoader,一来加载图片省事,二来带缓存功能,正是我想要的。但是getDrawable方法是在主线程中调用的,且要求返回Drawable对象用于显示,而我们是不能在主线程中进行网络访问的,所以需要异步加载。ImageLoader本身已经有异步加载的功能,所以我们需要将它与getDrawable方法结合起来。这里用的方法与百度上常见到的方法略有不同,因为百度上的方法在我这里会有BUG,在第二次进入时图片经常加载不出来。

首先,写一个类继承BitmapDrawable,代码如下:

package com.githang.gradledoc.chapter;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;

/**
 * User: Geek_Soledad(msdx.android@qq.com)
 * Date: 2014-11-30
 * Time: 00:09
 * FIXME
 */
public class URLDrawable extends BitmapDrawable {
    protected Bitmap bitmap;

    @Override
    public void draw(Canvas canvas) {
        if (bitmap != null) {
            canvas.drawBitmap(bitmap, 0, 0, getPaint());
        }
    }
}

这个类用于在getDrawable中返回的对象。

然后写一个类实现Html.ImageGetter接口,代码如下:

    public class URLImageParser implements Html.ImageGetter {
        TextView mTextView;

        public URLImageParser(TextView textView) {
            this.mTextView = textView;
        }

        @Override
        public Drawable getDrawable(String source) {
            final URLDrawable urlDrawable = new URLDrawable();
            Log.d("ChapterActivity", Consts.BASE_URL + source);
            ImageLoader.getInstance().loadImage(Consts.BASE_URL + source, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    urlDrawable.bitmap = loadedImage;
                    urlDrawable.setBounds(0, 0, loadedImage.getWidth(), loadedImage.getHeight());
                    mTextView.invalidate();
                    mTextView.setText(mTextView.getText()); // 解决图文重叠
                }
            });
            return urlDrawable;
        }
    }

这里的mTextView是我们要加载图片的TextView对象。这里我暂未对图片做自适应屏幕的适配,做的比较简单,只是把加载后的图片设置到之前返回的URLDrawable对象中的urlDrawable去,然后调用mTextView.invalidate()方法更新界面。

但是这样写完之后,还有一个问题。尽管我们对urlDrawable调用了setBounds设置它的边框,但是还是会出现图片重叠的问题。需要重新设置一下mTextView的内容,如上面代码中的:

mTextView.setText(mTextView.getText());

设置HTML到TextView的代码如下:

mDocView.setText(Html.fromHtml(doc, new URLImageParser(mDocView), null));

显示的代码格式全乱

TextView虽然可以显示html,但许多标签并不能支持。比如用于显示代码的<pre>,<code>这些标签。原本以为TagHandler可以解决这个问题,但是我在看了网上对TagHandler的用法介绍之后,发现这种用法并不能处理我遇见的这个问题,因为它只能处理解析到的标签之前的内容,无法处理标签之后的内容。好在我在设置HTML的内容到TextView之前是有用jsoup进行一些处理的,于是决定用jsoup进行处理。
处理方法很简单,对<pre>里的标签,把换行符替换成<br/>,把空格替换成&nbsp;,代码如下:
    /**
     * 处理代码显示问题.
     *
     * @param chapter 章节内容的html元素。
     */
    private void handlerPreTag(Element chapter) {
        Elements preElems = chapter.select("pre");
        for (Element elem : preElems) {
            elem.html(elem.html().replaceAll("\n", "<br/>").replaceAll(" ", " "));
        }
    }

最后上两张解决这个问题后的效果图:



本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41673425

Android开发技巧——TextView加载HTML的图片及代码显示问题的更多相关文章

  1. Android开发之高效加载Bitmap

    一.概述 在Android开发中,我们经常与Bitmap打交道,而对Bitmap的不恰当的操作经常会导致OOM(Out of Memory).这篇文章我们会介绍如何高效地在Android开发中使用Bi ...

  2. Android开发问题积累 <加载在线Gif><WebView无法加载网页图片>

    在线Gif加载 解决办法 Glide完美解决 Glide.with(context).load(pic).placeholder(R.drawable.loading).into(imageView) ...

  3. Android 开发 上拉加载更多功能实现

    实现思维 开始之前先废话几句,Android系统没有提供上拉加载的控件,只提供了下拉刷新的SwipeRefreshLayout控件.这个控件我们就不废话,无法实现上拉刷新的功能.现在我们说说上拉加载更 ...

  4. android开发--使用webView加载tel协议不会打开拨号盘解决

    在加载url之前进行判断,url是否是tel协议开头,然后进行加载,即可打开拨号盘 mWebView.setWebViewClient(new WebViewClient() { @Override ...

  5. Android开发技巧——ViewPager加View情况封装PagerAdapter的实现类

    ViewPager是Android的support库中的一个控件. ViewPager + Fragment的使用,已经有FragmentAdapter的实现可以帮助我们快速进行开发了: ViewPa ...

  6. Android开发中如何加载API源码帮助开发

    在eclipse中添加android源码既可以帮助我们的开发,又能使我们边开发边学习. android环境的搭建:http://blog.csdn.net/dawanganban/article/de ...

  7. Android开发技巧一--weight属性实现视图的居中(半)显示

    面试时,一位面试官问到:“如果我想讲按钮居中显示,并且占据其父视图宽度的一半,应该怎么做到呢?”即实现这种效果: 我们使用weightSum属性和layout_weight属性实现这一要求: < ...

  8. Android中的Glide加载图片

    注意:在Android Studio的项目的build.gradle中添加: compile 'com.github.bumptech.glide:glide:3.6.1' 然后同步一下 目录: 使用 ...

  9. wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...

随机推荐

  1. Go 语言函数

    函数是基本的代码块,用于执行一个任务. Go 语言最少有个 main() 函数. 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务. 函数声明告诉了编译器函数的名称,返回类型,和参数. ...

  2. PHP 序列化/反序列化的方法函数

    我们在开发的过程中常常遇到需要把对象或者数组进行序列号存储,反序列化输出的情况.特别是当需要把数组存储到mysql数据库中时,我们时常需要将数组进行序列号操作. 序列化(串行化):是将变量转换为可保存 ...

  3. Docker 列出镜像

    使用 docker images 显示本地已有的镜像. $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu ...

  4. 虚拟机访问互联网的方法 -- 以RedHat系为例

    在虚拟机的三种网络模式中(Host-Only.桥接.NAT),能够实现虚拟机访问互联网的只有桥接与NAT模式,而Host-only主能实现虚拟机与主机两者间的通信.下面以RedHat系虚拟机系统为例, ...

  5. 前端技术之_CSS详解第一天

    前端技术之_CSS详解第一天 一html部分 略.... 二.列表 列表有3种 2.1 无序列表 无序列表,用来表示一个列表的语义,并且每个项目和每个项目之间,是不分先后的. ul就是英语unorde ...

  6. Python pandas.io.data 模块迁移

    这段时间用pandas做数据分析, import pandas.io.data as web 然后得到下面的错误提示 "The pandas.io.data module is moved ...

  7. iOS进阶之页面性能优化

    转载:http://www.jianshu.com/p/1b5cbf155b31 前言 在软件开发领域里经常能听到这样一句话,"过早的优化是万恶之源",不要过早优化或者过度优化.我 ...

  8. Winform DevExpress控件库(一) DevExpress控件库的安装与新建第一个DevExpress项目

    前言:因为这段时间要接触到DevExpress控件库,而我本身甚至对winform的控件都了解甚少,所以处在学习中,写下博客主要是为了方便后期的回顾,当然也可以给一些新人第一次接触时做为学习的参考,以 ...

  9. 好久没有写BLOG了,人老了就开始变懒了【非技术】

    算算到今天,在码农的路上已经走了15年了.马上就40不惑的我,现在是充满的疑惑.

  10. Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...