Android EditText载入HTML内容(内容包括网络图片)

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中显示出来。并且不会和文字的位置重叠。是不是很的简单?

时间: 2024-09-27 23:31:38

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

Android EditText加载HTML内容(内容包含网络图片)

android中的Html.fromHtml可以用来加载HTML的内容,fromHtml有三个参数需要设置,第一个是要显示的html内容,第二个就是要说的重点,ImageGetter,用来处理图片加载的,第三个 TagHandler可以设置为null,接下来我们来讲解下ImageGetter,网上很多的方法都是直接引用本地的图片,是同步的,比如: private ImageGetter imageGetter = new ImageGetter() { @Override public Draw

Android EditText内容监听

监听 EditText的内容变化,作出对应的处理. MainActivity.class package com.example.edittextdemo; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.view.View.On

android EditText控件如何禁止输入内容

问题? android EditText控件如何禁止往里面输入内容? 修改版解决方法: EditText editText =  (EditText) findViewById(R.id.editText1); editText.setKeyListener(null); 看到这个问题大家可能有点奇怪了,EditText的功能不就是往上面写入内容吗? 再者,如果真要禁止输入文本,在布局文件中添加 android:focusable="false", 或者在代码中使用editText.s

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

最近在初学android开发,在更新SDK的时候遇到了麻烦. 发现Extras文件夹下为空,没有内容,包括sdk列表也不全面,更新也没有反应 解决方法: 1.在SDK Manager下Tools->Options打开了SDK Manager的Settings a.在"HTTP Proxy Server"和"HTTP Proxy Port"输入框内填入mirrors.neusoft.edu.cn和80(东软的国内镜像,速度很快,腾讯的镜像速度也挺快的.) b.选

Android 存储文件方式之一---SharedPreferences 内容提供者,以xml 的方式进行数据 存储。是一种轻量级的文件数据存储

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 //UI界面的布局 文件<br><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"

EditText对输入的内容进行过滤

在做项目开发的时候,有时候要求输入框EditText只能输入特定内容,比如手机号码只能输入数字,用户名密码能输入字母及数字等.针对这种要求android中也自带了一些处理方式,比如可以在布局文件中设置android:inputType="number"保证只能输入数字等,也可以在布局文件中设置android:digits=""设置特定的字字符等.今天我们要讲的是另外一种方式,就是通过EditText的addTextChangedListener()监听来实现对输入内

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

怎么获取一个AlertDialog中的EditText中输入的内容? new AlertDialog.Builder(this)   .setTitle("请输入")   .setIcon(android.R.drawable.ic_dialog_info)   .setView(new EditText(this))   .setPositiveButton("确定", null)   .setNegativeButton("取消", null

Android开发之ContentProvider(内容提供者)

1. ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同. 如:采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据. 而使用ContentProvider共享数据的好处是统一了数据访问方式 2.通过ContentProv

去掉配对的双引号之间的内容(包括双引号)

问题: 文本中一行的内容包含了配对的双引号,双引号可能是好几对,如下面的样例所示. LOG("abcde"); abc"DEF","Hat"hij 134"tlh"567"xzt"789 现在要求去掉配对的双引号的之间的内容(包括双引号),期望得到的结果如下. LOG(); abc,hij 134567789 解答: sed -r 's/"[^"]*"//g' file LOG