android富文本 加载带图片的html<drawable为null的bug>

textView加载带图片的html

在android中textView中setText中加入富文本以及webView嵌入url是android交互html最简单的两种方式;
最近在项目中涉及到富文本;
当不考虑html中图片加载时候比较简单:

Spanned spanned =  = Html.fromHtml(html);
tvContent.setText(spanned );

只需要提供html即可,但是如果html中有pic时候 则会出现以下的情况;
这里写图片描述

可以看到本该出现pic的地方出现了空格;所以在填充富文本时候需要对图片处理一下,在Html中有两个方法:

 public static Spanned fromHtml(String source) {

    }

    public static Spanned fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler) {

    }

其中三参的方法gormHtml可以处理图片的问题,需要匿名内部类实现 ImageGetter,第三个参数置为null:

ImageGetter imgGetter = new Html.ImageGetter() {  
        public Drawable getDrawable(String source) {  

            Drawable drawable = null;  
            URL url;  
            try {  
                url = new URL(source);  
                Drawable.createFromStream(url.openStream(), "");   
            } catch (Exception e) {  
                e.printStackTrace();  
                return null;  
            }  
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),  
                    drawable.getIntrinsicHeight());  

            return drawable;  
        }  
    };  

    CharSequence charSequence = Html.fromHtml(html, imageGetter, null);
    tvContent.setText(charSequence );

这样就很明了了,imageGetter就是根据url来获取网络图片填充富文本的,很明显是一个好事操作,所以需要开子线程,而text的setText又是跟新UI的操作;这一点必须注意,不然你的drawable会为空,text无法填充富文本;
但是在填充过程中当html中pic比较多的时候回有部分获取不到;接下来就需要你在handler中控制一下就ok~ 下面来看最终代码:

    /**
     *
     * @param imageUrl
     * @return
     */
   public Drawable getImageFromNetwork(String imageUrl) {
        URL myFileUrl = null;
        Drawable drawable = null;
        try {
            myFileUrl = new URL(imageUrl);


            HttpURLConnection conn = (HttpURLConnection) myFileUrl
                    .openConnection();
            conn.setDoInput(true);

            conn.connect();
            InputStream is = conn.getInputStream();
            drawable = Drawable.createFromStream(is, null);

            is.close();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return drawable;
    }

    Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            if (msg.what == 0x101) {
                //tvContent.setText((CharSequence) msg.obj);
                if (drawable == null){
                    bindData();
                    return false;
                }
                if (ncontent != null){
                    tvContent.setText((CharSequence) msg.obj);
                    tvContent.setClickable(true);
                    tvContent.setMovementMethod(LinkMovementMethod.getInstance());
                }

            }
            return false;
        }
    });

    private void bindData() {
        tvTitle.setText(mInfo.getNtitle());
        ncontent = mInfo.getNcontent();

        new Thread(new Runnable() {
            Message msg = Message.obtain();

            @Override
            public void run() {
                Html.ImageGetter imageGetter=new Html.ImageGetter() {
                    @Override
                    public Drawable getDrawable(String source) {

                        //String source1 = source;
                        ///Content/
                        if (source.substring(0,8).equals("/Content")){
                            source = Constant.BASE_URL + source;
                        }
                        drawable = getImageFromNetwork(source);
                        if (drawable != null){
                            drawable.setBounds(0,0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                        }else if (drawable == null){
                            //bindData();
                            return null;
                        }


                        return drawable;
                    }
                };
               //Spanned spanned = Html.fromHtml(ncontent, imageGetter, null);
                CharSequence charSequence = Html.fromHtml(ncontent, imageGetter, null);
                msg.what = 0x101;
                msg.obj = charSequence;
                if (mHandler!= null){
                    mHandler.sendMessage(msg);
                }

            }
        }).start();


        toolbarTitle.setText(mInfo.getNtitle());
        String nsubtitle = mInfo.getNtitle();
        if (nsubtitle.length() > 10){
            String nsubtitle_new = nsubtitle.substring(0, 10);
            toolbarTitle.setText(nsubtitle_new + "...");
        }else{
            toolbarTitle.setText(nsubtitle);
        }

        tvTime.setText(mInfo.getNsendtime());

    }

这样图片就显示了;希望大家在阅读之后多提建议,期待成长;

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值