android中的Html.fromHtml能够用来载入HTML的内容。fromHtml有三个參数须要设置,第一个是要显示的html内容,第二个就是要说的重点,ImageGetter,用来处理图片载入的,第三个 TagHandler能够设置为null。接下来我们来解说下ImageGetter。网上非常多的方法都是直接引用本地的图片。是同步的,比方:

private ImageGetter imageGetter = new ImageGetter() {
@Override
public Drawable getDrawable(String source) {
String f = pic_path.substring(0, 1);
String url = pic_path.substring(2);
if (f.equals("1")) {
try {
ContentResolver cr = getActivity().getContentResolver();
Uri uri = Uri.parse(url);
Bitmap bitmap = getimage(cr, uri);
return getMyDrawable(bitmap);
} catch (Exception e) {
e.printStackTrace();
return null;
}
} else {
return null;
}
}
};

上面的代码是我做的一个项目里面用到的引用本地图片的方法,重写imagegetter,然后用ContentResolver来读取图片转换为Bitmap,然后再进行显示。但是。非常多时候会我们都须要引用的是网络图片的。那这种方法即可不通了。查找了非常多资料。假设直接在里面用异步的方法来载入图片的话。显示出来的是一个正方形的点的。那么问题来了,我们应该怎么去载入网络图片呢?

首先。我们先创建一个URLDrawable,让它去继承BitmapDrawable,重写draw方法,这个有什么用呢?这个能够让你载入图片的时候显示初始的图片,也就是载入中的图片。

URLDrawable.java:

public class URLDrawable extends BitmapDrawable {
// the drawable that you need to set, you could set the initial drawing
// with the loading image if you need to
protected Drawable drawable; @Override
public void draw(Canvas canvas) {
// override the draw to facilitate refresh function later
if(drawable != null) {
drawable.draw(canvas);
}
}
}

接下来就是重写ImageGetter

URLImageParser继承ImageGetter

放源代码

URLImageParser.java

public class URLImageParser implements ImageGetter {
Context c;
EditText container; /***
* 构建URLImageParser将运行AsyncTask,刷新容器
* @param t
* @param c
*/
public URLImageParser(EditText t, Context c) {
this.c = c;
this.container = t;
} public Drawable getDrawable(String source) {
URLDrawable urlDrawable = new URLDrawable(); // 获得实际的源
ImageGetterAsyncTask asyncTask =
new ImageGetterAsyncTask( urlDrawable); asyncTask.execute(source); //返回引用URLDrawable我将改变从src与实际图像标记
return urlDrawable;
} public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> {
URLDrawable urlDrawable; public ImageGetterAsyncTask(URLDrawable d) {
this.urlDrawable = d;
} @Override
protected Drawable doInBackground(String... params) {
String source = params[0];
return fetchDrawable(source);
} @Override
protected void onPostExecute(Drawable result) {
// 设置正确的绑定依据HTTP调用的结果
Log.d("height",""+result.getIntrinsicHeight());
Log.d("width",""+result.getIntrinsicWidth());
urlDrawable.setBounds(0, 0, 0+result.getIntrinsicWidth(), 0+result.getIntrinsicHeight()); // 改变当前可提取的參考结果从HTTP调用
urlDrawable.drawable = result; // 绘制图像容器
URLImageParser.this.container.invalidate(); // For ICS
URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight() + result.getIntrinsicHeight())); // Pre ICS
URLImageParser.this.container.setEllipsize(null);
} /***
* 得到Drawable的URL
* @param urlString
* @return
*/
public Drawable fetchDrawable(String urlString) {
try {
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth(), 0
+ drawable.getIntrinsicHeight());
return drawable;
} catch (Exception e) {
return null;
}
} private InputStream fetch(String urlString) throws MalformedURLException, IOException {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(urlString);
HttpResponse response = httpClient.execute(request);
return response.getEntity().getContent();
}
}
}

代码里的凝视也很的清楚明了了,这里就不用反复说明了,最重要的就是要重写onPostExecute。这种方法是载入完成之后UI的刷新用的,须要对drawable进行重绘才干在EditText中显示出来。并且不会和文字的位置重叠。是不是很的简单?

Android EditText载入HTML内容(内容包括网络图片)的更多相关文章

  1. Android EditText内容监听

    监听 EditText的内容变化,作出对应的处理. MainActivity.class package com.example.edittextdemo; import android.app.Ac ...

  2. Android开发之搜芽项目的图片载入问题(使用Volley进行网络图片载入)

    搜芽的移动开发这几天进度相对来说很的快. 可是美中不足的就是网络图片的载入问题. 我有两套方案: 1)沿用迅雷动漫的图片载入.迅雷动漫也是用的一个开源的库.可是不知道是我使用出了问题还是真的是它的问题 ...

  3. Android SDK Manager无法更新,内容显示不全的解决办法

    最近在初学android开发,在更新SDK的时候遇到了麻烦. 发现Extras文件夹下为空,没有内容,包括sdk列表也不全面,更新也没有反应 解决方法: 1.在SDK Manager下Tools-&g ...

  4. 如何获取一个AlertDialog中的EditText中输入的内容

    怎么获取一个AlertDialog中的EditText中输入的内容? new AlertDialog.Builder(this)   .setTitle("请输入")   .set ...

  5. Windows Azure Marketplace 为新增的 50 个国家/地区提供,并推出了令人振奋的新增内容,包括我们自己的 Bing 光学字符识别服务

    尊敬的 Windows Azure Marketplace 用户: 我们有一些让人激动的新闻与您分享:我们现在为新增的 50 个国家/地区提供 Marketplace.自此,我们提供支持的国家/地区总 ...

  6. 解决Firefox显示“已阻止载入混合活动内容”的方法

    今天把项目放到服务器上了,调试的时候出现“已阻止载入混合活动内容……”的报错: 解决方法如下: 方法1:让Firefox暂时不阻止 打开新标签页,在地址栏输入 about:config,进入配置页面. ...

  7. Android测试(四)——内容供应器泄露

    内容供应器:用来存储和查询应用程序中的数据或来自电话的数据,所有内容供应器都具有唯一的统一的资源标识符(URI)以便被识别和查询. 内容供应期命名惯例:以content://开始 当Android A ...

  8. SpannableString 转换局部字体大小,但在EditText测量之前设置内容,测量高度为,字体变小之前的高度

    public void setHint(@NonNull String hint, @Nullable CharSequence subHint) { this.hint = hint; if (su ...

  9. 使用buffered流结合byte数组,读入文件中的内容,包括中文字符

    package com.itcast.demo05.Buffered;import java.io.BufferedInputStream;import java.io.FileInputStream ...

随机推荐

  1. c& c++ enum

    1.为什么要用enum       写程序时,我们常常需要为某个对象关联一组可选alternative属性.例如,学生的成绩分A,B,C,D等,天气分sunny, cloudy, rainy等等.   ...

  2. operator.itemgetter的用法【转】

    operator.itemgetter函数 operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. a = [,, ...

  3. 一天一个Java基础——排序

    插入排序 直接插入排序: 当插入第i个数据元素k时,由前i-1个数据元素组成已排序的数据序列,将k与数据序列中各数据元素依次进行比较后,插入到数据序列的适当位置,使得插入后的数据序列仍是排序的. 直接 ...

  4. 【有趣~】SFOJ-1711 Obey的恋爱、NYOJ-739 笨蛋难题

    笨蛋难题四 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 这些日子笨蛋一直研究股票,经过调研,终于发现xxx公司股票规律,更可喜的是 笨蛋推算出这家公司每天的股价, ...

  5. mysql中出现的Data truncated for column

    mysql中想一个数据库中插入一条记录时,有可能因为好多原因,会出现Data truncated for column XXXXX的错误,这是因为你的数据类型的长度不一致导致的,仔细查看一下数据类型的 ...

  6. POJ 1173 Find them, Catch them

    题意:有两个帮派,每个人只属于一个帮派,m次操作,一种操作告诉你两个人不是一个帮派的,另一种操作问两个人是不是在一个帮派. 解法:并查集+向量偏移.偏移量表示和根节点是不是同一帮派,是为0,不是为1. ...

  7. HDU 5876 Sparse Graph

    Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

  8. Delphi RichEdit操作

    1.选择设置对齐 RichEdit1.SelectAll;RichEdit1.Paragraph.Alignment:=taLeftJustify; // switch for other align ...

  9. mybatis系列-05-SqlMapConfig.xml详解

    mybatis的全局配置文件SqlMapConfig.xml,配置内容如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandler ...

  10. Cloudera 建议使用 NTP 使 Hadoop 群集实现时间同步

    主机的 NTP 服务未响应时钟偏差请求. 建议 这是主机运行状况测试,用于检查主机的系统时钟是否与其 NTP 服务器不同步.该测试能检查“ntpdc -c loopinfo”命令报告的主机时钟偏差绝对 ...