前段时间做了一个Android会议管理系统,项目需求涉及到EditText的图文混排,如图:



在上图的”会议详情”中。须要支持文本和图片的混合插入,下图演示输入的演示样例:

当会议创建完毕以后,保存数据到server。然后查看刚刚创建好的会议。如图:


一、明白需求

首先。点击”会议详情”文本框中,正常输入文本,然后点击左下角的图片图标。进入系统的相冊用来选择一张图片并插入到文本框中,你还能够将光标停留在随意的文字中间,完毕图片的插入。回退建即能够逐个删除文字,也能够删除图片。

二、实现思路

  1. 假设要在一个EditText中显示图片,首先得简单了解一下SpannableStringImageSpan的使用。
  2. 在上面的图文混排的EditText中。尽管看到了生动的图文效果。可是实际上输出EditTextget Text().toString()。
  3. 事实上是:"插入一张图片<img src=\"" + url1+ "\" />。
  4. 再插入一张图片<img src=\"" + url2+ "\" />。"
  5. 也就是说,当我选择图片插入到EditText中时,尽管显示了该图片,可是插入进去的事实上是这个图片的url
  6. 当我保存这条记录时,传给server的值就是:"插入一张图片<img src=\"" + url1+ "\" />。
  7. 再插入一张图片<img src=\"" + url2+ "\" />。"
  8. 这部分代码例如以下:

1.点击图片button进入系统相冊

  1. /**
  2. * 图文详情页面选择图片
  3. */
  4. public void getImage() {
  5. intent = new Intent(Intent.ACTION_GET_CONTENT);
  6. intent.addCategory(Intent.CATEGORY_OPENABLE);
  7. intent.setType("image/*");
  8. startActivityForResult(intent, 0);
  9. }

2.获取到该图片并调用接口将图片上传到server,上传成功以后获取到server返回的该图片的url

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. if (resultCode == RESULT_OK && requestCode == 0) {
  4. ContentResolver resolver = getContentResolver();
  5. // 获得图片的uri
  6. Uri originalUri = data.getData();
  7. bitmap = null;
  8. try {
  9. Bitmap originalBitmap = BitmapFactory.decodeStream(resolver.openInputStream(originalUri));
  10. bitmap = ImageUtils.resizeImage(originalBitmap, 600);
  11. // 将原始图片的bitmap转换为文件
  12. // 上传该文件并获取url
  13. new Thread(new Runnable() {
  14. @Override
  15. public void run() {
  16. insertPic(bitmap, 0);
  17. }
  18. }).start();
  19. } catch (FileNotFoundException e) {
  20. e.printStackTrace();
  21. }
  22. }

3.通过运行insertPic()方法,获取到url并做一些处理,让其在edittext中显示

  1. /**
  2. * 插入图片
  3. */
  4. private void insertPic(Bitmap bm, final int index) {
  5. AjaxParams params = new AjaxParams();
  6. try {
  7. params.put("image", LeoUtils.saveBitmap(bm));
  8. } catch (FileNotFoundException e) {
  9. e.printStackTrace();
  10. }
  11. FinalHttp fh = new FinalHttp();
  12. System.out.println("params=" + params.toString());
  13. fh.post(HttpUrlConstant.UPLOAD_PIC, params, new AjaxCallBack<Object>() {
  14. @Override
  15. public void onFailure(Throwable t, int errorNo, String strMsg) {
  16. super.onFailure(t, errorNo, strMsg);
  17. ToastUtil.show(getApplicationContext(), "图片上传失败,请检查网络");
  18. }
  19. @Override
  20. public void onSuccess(Object t) {
  21. super.onSuccess(t);
  22. System.out.println(t.toString());
  23. try {
  24. JSONObject jsonObject = new JSONObject(t.toString());
  25. String url = jsonObject.getString("recordName");
  26. switch (index) {
  27. case 0:
  28. // 依据Bitmap对象创建ImageSpan对象
  29. ImageSpan imageSpan = new ImageSpan(CreateMeetingActivity.this, bitmap);
  30. // 创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像
  31. String tempUrl = "<img src=\"" + url + "\" />";
  32. SpannableString spannableString = new SpannableString(tempUrl);
  33. // 用ImageSpan对象替换你指定的字符串
  34. spannableString.setSpan(imageSpan, 0, tempUrl.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  35. // 将选择的图片追加到EditText中光标所在位置
  36. int index = et_detail.getSelectionStart(); // 获取光标所在位置
  37. Editable edit_text = et_detail.getEditableText();
  38. if (index < 0 || index >= edit_text.length()) {
  39. edit_text.append(spannableString);
  40. } else {
  41. edit_text.insert(index, spannableString);
  42. }
  43. System.out.println("插入的图片:" + spannableString.toString());
  44. break;
  45. case 1:
  46. // 与本案例无关的代码
  47. break;
  48. }
  49. } catch (JSONException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. });
  54. }

上面的凝视写的非常具体了。即使之前不了解SpannerString和ImageSpan。相信也能够体会到它们的使用方法。

至此,android edittext的图文混合插入需求就已经完毕了。

三、补充说明

Q1: 为什么要把图片上传到server上获取url?

A1: PM要求每插入一次图片就要调接口将图片上传到server上。该接口会返回该图片的url过来。尽管这样的要求并非个好的解决方式。假设不须要保存图文混合插入的内容。那就不必运行这一步。在imageSpan替换时,能够用随意字符替换,由于对于spannebleString而言。插入的图片事实上就是一些字符而已,这一点能够输出edittext.gettext().tostring()来验证。

  1. // 用ImageSpan对象替换
  2. spannableString.setSpan(imageSpan, 0, "图片1", Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Q2: 为什么要把图片的url再次包装成带img标签的字符串?

  1. A2: 由于项目的另外一个需求是编辑会议。也就是图文混合插入的内容支持以后的再次编辑。
  2. 当调用会议编辑接口时。会返回会议详情的数据。
  3. 这些数据就是:"插入一张图片<img src=\"" + url1+ "\" />。
  4. 再插入一张图片<img src=\"" + url2+ "\" />。"
  5. 为了让会议详情页面的图文回显到EditText中,我会对这些字符串通过正则匹配"<img src=\''+*+"\">,
  6. 假设匹配到这样的格式。就代表它是一个图片。然后通过一些处理将图片回显出来。

Android图文混排-实现EditText图文混合插入上传的更多相关文章

  1. 仿小米便签图文混排 EditText解决尾部插入文字bug

    一直想实现像小米便签那样的图文混排效果,收集网上的办法无非三种: 1.自定义布局,每张图片是一个ImageView,插入图片后插入EditText,缺点是实现复杂,不能像小米便签那样同时选中图片和文字 ...

  2. 图文混排--CoreText的简单运用

    常见的在一些微博微信中可以看见一段文字中有不同的字体,字体有不同的颜色,并且可能会有一些笑脸之类的表情,这些可以通过图文混排做到. 图文混排可以通过WebView和CoreText做到,其他还有别的方 ...

  3. CoreText实现图文混排之点击事件

    今天呢,我们继续把CoreText图文混排的点击事件补充上,这样我们的图文混排也算是圆满了. 哦,上一篇的链接在这里 http://www.jianshu.com/p/6db3289fb05d Cor ...

  4. Laya的图文混排

    参考: Laya图文混排 Laya的图文混排教程 编辑模式F9,增加laya.html.js库 在层级窗口右键,添加一个HtmlDivElement组件 大致的原理: 1. 例如输入框的字符串是 &q ...

  5. EditText图文混排

    下面就具体说一下我遇到的问题,首先是EditText里面的图文混排问题,这个问题的难点就是三点: 1.怎么插图片 2.怎么保存插入的图片和文字 3.怎么解析回图片和文字 解决: 一.怎么插入图片 在这 ...

  6. 使用android SpannableStringBuilder实现图文混排

    项目开发中需要实现这种效果 多余两行,两行最后是省略号,省略号后面是下拉更多 之前用过的是Html.fromHtml去处理图文混排的,仅仅是文字后图片或者文字颜色字体什么的, 但是这里需要在最后文字的 ...

  7. Android 自绘TextView解决提前换行问题,支持图文混排

    先看下效果图: 上面是MTextView,下面是默认的TextView. 一.原因 用最简单的全英文句子为例,如果有一个很长的单词,这一行剩余的空间显示不下了,那么规则就是不打断单词,而是把整个单词丢 ...

  8. 使用android SpannableStringBuilder实现图文混排,看到许多其他

    项目开发需要达到这种效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmFuY3lsb3ZlamF2YQ==/font/5a6L5L2T/fontsiz ...

  9. Android自动解析html带图片,实现图文混排

    在android中,如何将html代码转换为text,然后显示在textview中呢,有一个简单直接的方法: textView.setText(Html.fromHtml(content)); 然而用 ...

随机推荐

  1. 将python的程序包装成windows下的service

    使用python编写的脚本应用程序,在运行的时候需要有python的运行环境,但是我们肯定是希望整个python程序能够像应用程序一样打包生成一个包括其运行环境的exe文件包,这是第一步,但是要想使用 ...

  2. hiho一下第76周《Suzhou Adventure》

    我是菜鸡,我是菜鸡,我是菜鸡....重要的事说三遍 算是第一次做树形dp的题吧,不太难.. 园林构成一棵树,root为1,Hi从root出发,有k个园林必须玩,每个园林游玩后会得到权值w[i],最多玩 ...

  3. 关于作者&情况

    本校第一次做信奥 , 如有错误, 见谅 本人之前从未接触编程, 选择信奥也只是因为怕被其他奥赛给淘汰... 这应该是懦弱吧...... 但自从接触编程以来, 虽然算不上极大的热爱, 但发自内心地喜欢它 ...

  4. B - Expression

    Problem description Petya studies in a school and he adores Maths. His class has been studying arith ...

  5. arg max f(x) 含义

    y = f(x) 是一般常见的函数式,如果给定一个x值,f(x)函数式会赋一个值給y. y = max f(x) 代表:y 是f(x)函式所有的值中最大的output. y = arg max f(x ...

  6. WordPress瀑布流主题PinThis中文版v1.6.8

    PinThis主题来源于英语网站http://pinthis.pixelbeautify.com/的汉化(语言文件+控制面板),中文版采用的是翻译器手工核对,并不完美,只对主题中文化,其他没做任何更改 ...

  7. js判断浏览器是android还是ios还是微信浏览器

    第一种方法<script type="text/javascript"> //判断访问终端 var browser={ versions:function(){ var ...

  8. 【MFC】基于opencv的趣味相机

    为了参加学校的科技节,故用mfc随手制作了一个名为<趣味相机>的小程序: 其中对图形图像处理运用到了opencv. 效果图 这界面逼格低了点╭(╯^╰)╮ 有兴趣的朋友可以在此下载尝试:h ...

  9. Redis入门笔记-redis内部数据结构(01)

    redis是一个轻量级的Nodsql数据库,使用kev-value的形式存储数据,在redis的世界里,没有整数.浮点数等概念,大多数情况下数据以字符串形式展现,偶尔会出现Long类型数据的场景. 一 ...

  10. 基于ACE的TAO开发---一个简单的入门实例-----VS2008(二)

    上一节已经说了如何编译idl文件.现在就用编好的文件来写一个最小的corba小程序的.程序分为服务器程序和客户端程序. 说明下,代码是<基于C++CORBA高级编程>一书中的例子. 1.首 ...