Android TextView使用HTML处理字体样式、显示图片等

项目上有个需求:后台想直接控制文字的格式样式和添加图片。像网页一样修改好了整个网页通过接口给我,让我显示在消息提示框里。

怎么用TextView控件显示带有格式的文字,可否使用Html布局?查了下Android 帮助文档,其提供了android.text.Html类和Html.ImageGetter、Html.TagHandler接口

        其实本不打算写这篇博文的,但看到网络上关于此的文章,找了好多资料,文本显示很简单,就是这个图就是加载不出来



我把代码贴一下:

html = "<html><head><title>TextView使用HTML</title></head><body><p><strong>强调</strong></p><p><em>斜体</em></p>"
				+ "<p><a href=\"http://www.dreamdu.com/xhtml/\">超链接HTML入门</a>学习HTML!</p><p><font color=\"#aabb00\">颜色1"
				+ "</p><p><font color=\"#00bbaa\">颜色2</p><h1>标题1</h1><h3>标题2</h3><h6>标题3</h6><p>大于>小于<</p><p>"
				+ "下面是网络图片</p><img src=\"http://avatar.csdn.net/0/3/8/1_zhang957411207.jpg\"/></body></html>";
		text = (TextView) findViewById(R.id.text_html);
		text.setMovementMethod(ScrollingMovementMethod.getInstance());// 滚动
		mImageGetter = new NetworkImageGetter(); 
		text.setText(Html.fromHtml(html,mImageGetter , null ));
如果不显示图这样就可以了:
text.setText(Html.fromHtml(html));

图片需要第二个参数

API:   Html.fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler);

下面是第二个参数的类(也可以用匿名内部类的写法直接new):

/** 
     * 网络图片 
     * @author Susie 
     */  
    private final class NetworkImageGetter implements Html.ImageGetter{  
  
        @Override  
        public Drawable getDrawable(String source) {  
              
            Drawable drawable = null;  
            // 封装路径  
            File file = new File(Environment.getExternalStorageDirectory(), picName);  
            // 判断是否以http开头  
            if(source.startsWith("http")) {  
                // 判断路径是否存在  
                if(file.exists()) {  
                    // 存在即获取drawable  
                    drawable = Drawable.createFromPath(file.getAbsolutePath());  
                    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  
                } else {  
                    // 不存在即开启异步任务加载网络图片  
                    AsyncLoadNetworkPic networkPic = new AsyncLoadNetworkPic();  
                    networkPic.execute(source);  
                }  
            }  
            return drawable;  
        }  
    }  

图片本地的名字:

/**网络图片name*/  
    private String picName = "networkPic.jpg";
先加载本地,如果本地没有就开始下载。

异步下载:

/** 
     * 加载网络图片异步类 
     * @author Susie 
     */  
    private final class AsyncLoadNetworkPic extends AsyncTask<String, Integer, Void>{  
  
        @Override  
        protected Void doInBackground(String... params) {  
            // 加载网络图片  
            loadNetPic(params);  
            return null;  
        }  
          
        @Override  
        protected void onPostExecute(Void result) {  
            super.onPostExecute(result);  
            // 当执行完成后再次为其设置一次  
            text.setText(Html.fromHtml(html, mImageGetter, null));  
        }  
        /**加载网络图片*/  
        private void loadNetPic(String... params) {  
            String path = params[0];  
              
            File file = new File(Environment.getExternalStorageDirectory(), picName);  
              
            InputStream in = null;  
              
            FileOutputStream out = null;  
              
            try {  
                URL url = new URL(path);  
                  
                HttpURLConnection connUrl = (HttpURLConnection) url.openConnection();  
                  
                connUrl.setConnectTimeout(5000);  
                  
                connUrl.setRequestMethod("GET");  
                  
                if(connUrl.getResponseCode() == 200) {  
                      
                    in = connUrl.getInputStream();  
                      
                    out = new FileOutputStream(file);  
                      
                    byte[] buffer = new byte[1024];  
                      
                    int len;  
                      
                    while((len = in.read(buffer))!= -1){  
                        out.write(buffer, 0, len);  
                    }  
                } else {  
                    Log.e("123", connUrl.getResponseCode() + "");  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally {  
                  
                if(in != null) {  
                    try {  
                        in.close();  
                    } catch (IOException e) {  
                        e.printStackTrace();  
                    }  
                }  
                if(out != null) {  
                    try {  
                        out.close();  
                    } catch (IOException e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
    }  
成功加载:


希望能帮到你。。。。。。




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
一、[Android实例]实现TextView里的文字有不同颜色 转eoe:http://www.eoeandroid.com/thread-4496-1-1.html import android.text.Html; TextView t3 = (TextView) findViewById(R.id.text3); t3.setText( Html.fromHtml( "<b>text3:</b> Text with a " + "<a href=\"http://www.google.com\">link</a> " + "created in the Java source code using HTML.")); 二、TextView显示html文件中的图片 转javaeye:http://da-en.javaeye.com/blog/712415 我们知道要让TextView解析和显示Html代码。可以使用 Spanned text = Html.fromHtml(source); tv.setText(text); 来实现,这个用起来简单方便。 但是,怎样让TextView显示Html中<image>节点的图像呢? 我们可以看到fromHtml还有另一个重构: fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler) 实现一下ImageGetter就可以让图片显示了: ImageGetter imgGetter = new Html.ImageGetter() { @Override public Drawable getDrawable(String source) { Drawable drawable = null; drawable = Drawable.createFromPath(source); // Or fetch it from the URL // Important drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable .getIntrinsicHeight()); return drawable; } }; 至于TagHandler,我们这里不需要使用,可以直接传null。 参考文档: http://tech-droid.blogspot.com/2010/06/textview-with-html-content.html英语好的朋友就直接看英文文档吧。 三、Android---文字中插入表情 转载自:http://blog.163.com/spf9190@126/blog/static/50207531201091545954587/ 这段时间在做一个短信项目,需要实现短信中插入表情的功能,本一位非常困难,经过一段时间的研究,发现还是比较簡単的,现在总结如下。 以短信输入框为例,短信的输入框是一个EditText,它的append方法不仅可以加入字符串,还可以添加HTML标记。以下就是使用HTML标记添加表情的具体操作。 首先需要构建一个ImageGetter,作用是通过HTML标记获得对应在res目录下的图片: ImageGetter imageGetter = new ImageGetter() { @Override public Drawable getDrawable(String source) { int id = Integer.parseInt(source); //根据id从资源文件中获取图片对象 Drawable d = getResources().getDrawable(id); d.setBounds(0, 0, d.getIntrinsicWidth(),d.getIntrinsicHeight()); return d; } }; 然后就可以直接往EditText视图中添加 inputLable.append(Html.fromHtml("<img src='"+clickedImageId+"'/>", imageGetter, null)); 其中 Html.fromHtml("<img src='"+clickedImageId+"'/>"就是HTML图片标记,在Android中支持了部分HTML标记的使用(这方面我还在继续研究),HTML标记必须被Html.fromHtml修饰。imageGetter即为之前创建的ImageGetter类型的对象。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值