Android点滴---TextView,RadioButton 设置 HTML文本,加载网络图片

现在在做一个题库类的项目,由于有些数学符号或者化学符号之类的没办法直接在前端显示,所以就使用了图文混排;

后台返回的数据直接是HTML格式的数据。

所以就开始去研究控件如何去显示HTML

先贴上参考的文章,感谢分享!

1、这种只适合加载本地图片,或者兼容版本在4.0以下

Android中Textview显示带html文本二-------【Textview显示本地图片】

上面这种方式,只要在百度上搜一下 Android TextView 设置 HTML 数据,就会找出来很多类似的,但是感觉这为大神写的最好!

如果HTML数据中,只有文本的话,使用下面的写法就Ok了,

        //如果 HTML数据中没有图片,仅仅是文本的话,直接这样设置就好了
        String html = "<p>这个就是测试</p><span>数据</span><img src=\"http://as114.com/pic/logo.png\" />";

        TextView mTvHello = (TextView) this.findViewById(R.id.tv_hello);
        mTvHello.setText(Html.fromHtml(html));

如果HTML数据中包含本地图片路径,你可以参考上面链接里,这位大神些的两种方式就可以了

        //主要是多了这个加载图片的参数
        Html.ImageGetter imageGetter = new Html.ImageGetter() {

            @Override
            public Drawable getDrawable(String source) {

                //实现方式可以参考上面的帖子,根据自己的需求来实现
                return null;
            }
        };

        //Html。fromHtml时  加上上面的参数
        mTvHello.setText(Html.fromHtml(html,imageGetter,null));

其实如果你的项目只兼容到 4.0以下,并且不怕卡的话,上面的帖子里也有实现方式(但是这种需求估计现在没有!

说一下原因,4.0以下是可以再主线程请求网络的,但是4.0以后是不可以在主线程请求网络,

        url = new URL(source);
        drawable = Drawable.createFromStream(url.openStream(), "");

上面这种写法就要在主线程加载图片, 虽然4.0以下可以使用,但是如果图片大的话,估计就直接卡死了,所以还是不要用了!

如果是本地图片的话,可以使用帖子中的两种图片方式,根据自己的需求来实现就OK了;

2、异步加载HTML中的图片  参考文章(stackoverflow 上的,有时候可以能访问不了,自己找办法……)

Android HTML ImageGetter as AsyncTask

上面的帖子完美解决了问题!

贴出代码,省的某些朋友不能访问帖子,看不了代码

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

/**
 * Created by Administrator on 2015/4/30.
 */
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);
        }
    }
}
package com.jddl.tvhtmldemo;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.text.Html;
import android.view.View;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;

/**
 * Created by Administrator on 2015/4/30.
 */
public class URLImageParser implements Html.ImageGetter {
    Context c;
    View container;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    /**
     * Construct the URLImageParser which will execute AsyncTask and refresh the container
     *
     * @param t
     * @param c
     */
    public URLImageParser(View t, Context c) {
        this.c = c;
        this.container = t;
    }

    public Drawable getDrawable(String source) {
        URLDrawable urlDrawable = new URLDrawable();

        // get the actual source
        ImageGetterAsyncTask asyncTask =
                new ImageGetterAsyncTask(urlDrawable);

        asyncTask.execute(source);

        // return reference to URLDrawable where I will change with actual image from
        // the src tag
        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) {
            // set the correct bound according to the result from HTTP call
            urlDrawable.setBounds(0, 0, result.getIntrinsicWidth(), result.getIntrinsicHeight());

            // change the reference of the current drawable to the result
            // from the HTTP call
            urlDrawable.drawable = result;

            // redraw the image by invalidating the container
            URLImageParser.this.container.invalidate();
        }

        /**
         * Get the Drawable from URL
         *
         * @param urlString
         * @return
         */
        public Drawable fetchDrawable(String urlString) {
            try {
                InputStream is = fetch(urlString);
                Drawable drawable = Drawable.createFromStream(is, "src");
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), 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();
        }
    }

    public URLImageParser() {
        super();
    }
}

由于我的项目中有选择题,和单选题,所以我用到了 TextView , RadioButton  和  CheckBox 三种控件,

下面是使用时的代码

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView mTvHello = (TextView) this.findViewById(R.id.tv_hello);

        String html = "<p>这个就是测试</p><span>数据</span><img src=\"http://as114.com/pic/logo.png\" />";

        mTvHello.setMovementMethod(ScrollingMovementMethod.getInstance());
        URLImageParser urlImgGetter = new URLImageParser(mTvHello, this);
        mTvHello.setText(Html.fromHtml(html, urlImgGetter, null));

        RadioButton mRbHtml = (RadioButton) this.findViewById(R.id.rb_html);
        URLImageParser urlImgGetterRb = new URLImageParser(mRbHtml, this);
        mRbHtml.setText(Html.fromHtml(html, urlImgGetterRb, null));

        CheckBox mCbHtml = (CheckBox) this.findViewById(R.id.cb_html);
        URLImageParser urlImgGetterCb = new URLImageParser(mCbHtml, this);
        mRbHtml.setText(Html.fromHtml(html, urlImgGetterCb, null));
    }
}

简单说一下我的理解(小弟 从事Android 不长,如有理解错误还请大家多多指教!

URLImageParser 类实现了 Html.ImageGetter 接口, 写法和别的没什么区别,

在getDrawable先返回一个urlDrawable,是一个空的图片

然后使用,异步加载图片,加载完成后在刷新图片和View

思路貌似很简单,但是之前没想着怎么实现!

再次感谢分享!

因为大多数都是写的TextView 使用的方法,

但是我想: 因为RadioButton 和 Checkbox 都是 TextView  的子类,所以应该也可以使用!

最终测试证明的想法是可行的,贴上 运行照片

时间: 2024-10-13 04:56:59

Android点滴---TextView,RadioButton 设置 HTML文本,加载网络图片的相关文章

Android Demo之旅 ListView底部添加加载更多按钮实现数据分页

在我们的实际项目中,数据应该说是很多的,我们的ListView不可能一下子把数据全部加载进来,我们可以当滚动条滚动到ListView的底部的时候,给一个更多的提示,当我们点击它即加载下一页的数据,相当与我们的分页效果,参考网上的东西,写了一个小小的demo,并总结了一些知识点,功能图如下:    源代码下载地址:http://download.csdn.net/detail/harderxin/7762625 掌握知识点: 1)自定义Adapter,将数据和ListView绑定起来 2)理解La

Android 异步加载网络图片并缓存到本地

在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片. 软引用是一个现在非常流行的方法,用户体验比较好,不用每次都需要从网络下载图片,如果下载后就存到本地,下次读取时首先查看本地有没有,如果没有再从网络读取. 记得2月份在和爱奇艺公司的项目总监一起搞联通的OTT盒子的时候他就提了一下软引用,奇艺做的手机客户端就是采用这种方法,所以你会发现奇艺客户端占用很大的空间,下面就分享一下异步加载网络图片的方法吧. FileCache

最新Android ListView 下拉刷新 上滑加载

开发项目过程中基本都会用到listView的下拉刷新和上滑加载更多,之前大家最常用的应该是pull to refresh或它的变种版吧,google官方在最新的android.support.v4包中增加了一个新类SwipeRefreshLayout,地址 这个类的作用就是提供官方的下拉刷新,并且效果相当不错,而上拉加载更多则用我们自定义的listview,也是相当简单. 下拉刷新 简单的介绍下: 首先它是一个viewgroup,但是它只允许有一个子控件,子控件能是任何view,使用的时候,所在

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计 在iOS开发中,图文混排一直都是UI编程的一个核心点,也有许多优秀的第三方引擎,其中很有名的一套图文混排的框架叫做DTCoreText.但是在前些日的做的一个项目中,我并没有采用这套框架,原因有二,一是这套框架体积非常大,而项目的需求其实并不太高:二是要在这套框架中修改一些东西,难度也非常大,我最终采用的是一个叫做RCLabel的第三方控件,经过一些简单的优化和完善,达到了项目的要求. 先来介绍一下我项目中的图文混排的需求:首先我从服

Android Volley入门到精通:使用Volley加载网络图片

在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完全解析(一),初识Volley的基本用法. 在上篇文章中有提到过,Volley是将AsyncHttpClient和Universal-Image-Loader的优点集成于一身的一个框架.我们都知道,Universal-Image-Loader具备非常强大的加载网络图片的功能,而使用Volley,我们

Android中用双缓存技术,加载网络图片

最近在学校参加一个比赛,写的一个Android应用,里面要加载大量的网络图片,可是用传统的方法图片一多就会造成程序出现内存溢出而崩溃.因为自己也在学习中,所以看了很多博客和视频,然后参照这些大神的写源码,自己写了一个加载网络图片工具类. 里面要用到一个经典的图片缓存库DiskLruCache 下载地址为:  DiskLruCache下载 下面是使用这个类实现的 双缓存网络图片加载 [java] view plain copy public class DiskLruCacheUtils { pr

Android三种基本的加载网络图片方式(转)

Android三种基本的加载网络图片方式,包括普通加载网络方式.用ImageLoader加载图片.用Volley加载图片. 1. [代码]普通加载网络方式 ? 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

Android中使用WebView, WebChromeClient和WebViewClient加载网页 (能够执行js)

Android中使用WebView, WebChromeClient和WebViewClient加载网页 在android应用中,有时要加载一个网页,如果能配上一个进度条就更好了,而android 中提供了其很好的支持,下面是一个例子程序,先帖: 1 2 3 4 <?xml version="1.0" encoding="utf-8"?> <WebView xmlns:android="http://schemas.android.com

Android加载网络图片学习过程

好多应用,像我们公司的<乘友>还有其他的<飞鸽><陌陌><啪啪>这些,几乎每一款应用都需要加载网络图片,那ToYueXinShangWan,这是比须熟练掌握的一个点,下面开始学习: 一.最简单加载网络图片 从网络上取图片数据,显示在应用中,简单不赘述: try { URL url = new URL(path); //path图片的网络地址 HttpURLConnection httpURLConnection = (HttpURLConnection) u