EditText和TextView一样,也可以进行图文混排。所不同的是,TextView只用于显示图文混排效果,而EditText不仅可显示,也可混合输入文字和图像,让我们先回顾一下图5.2所示的QQ聊天输入框,在输入框中可以同时输入文字和表情图像。实际上,这种效果在Android SDK中只需要几行代码就可以实现。为了使读者更有学习的冲动,先来欣赏一下即将实现的效果,如图5.16所示。

图5.16 在EditText控件中输入文字和图像

为了实现这个程序,首先来准备一些要用到的素材,也就是要在EditText控件中输入的图像文件。本例准备了9个png图像文件(face1.png至face9.png),都放在了res\drawable目录中。

接下来在屏幕上放一个只能显示3行(可输入多行)的EditText和一个Button,布局文件的代码如下:

android:orientation="vertical" android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:layout_height="wrap_content" android:lines="3" android:gravity="left|top"/>

android:layout_height="wrap_content" android:text="随机插入表情"

android:onClick="onClick_RandomFace" android:layout_marginTop="10dp" />

上面代码的标签中将android:gravity属性值设为left|top。以使输入的文本从左上角开始显示,如果不设置该属性,则输入的文本会从左侧中心位置开始显示(由于设置了android:line=”3”,因此,EditText可同时显示三行的内容,所以会存在这个问题,如果只显示一行,则不存在这个问题)。

标签的android:onClick属性值指定了单击事件方法(onClick_RandomFace),在该方法中随机获得了face1.png至face9.png中任意一个图像资源的ID。最常用的方法是将这9个图像资源ID放到数组中,然后随机产生一个数组索引来获取相应的图像资源ID。但本例未采用这种方法,而是采用了直接通过反射技术从R.drawable类中获得图像资源ID的方法。这种方法的好处是一但图像资源非常多时,可以不需要在数组中挨个定义就可以获得任意的图像资源ID。

在5.2.2节使用了标签来插入图像,虽然在EditText控件中插入图像也可采用这种方法。但本例使用了另外一种更简单的方法,就是使用android.text.style.ImageSpan类来直接插入图像。下面来看看具体的实现代码。

public void onClick_RandomFace(View view)

{

// 随机产生1至9的整数

int randomId = 1 + new Random().nextInt(9);

try

{

// 根据随机产生的1至9的整数从R.drawable类中获得相应资源ID(静态变量)的Field对象

Field field = R.drawable.class.getDeclaredField("face" + randomId);

// 获得资源ID的值,也就是静态变量的值

int resourceId = Integer.parseInt(field.get(null).toString());

// 根据资源ID获得资源图像的Bitmap对象

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId);

// 根据Bitmap对象创建ImageSpan对象

ImageSpan imageSpan = new ImageSpan(this, bitmap);

// 创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像

SpannableString spannableString = new SpannableString("face");

// 用ImageSpan对象替换face

spannableString.setSpan(imageSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

// 将随机获得的图像追加到EditText控件的最后

edittext.append(spannableString);

}

catch (Exception e)

{

}

}

编写上面代码需要注意如下几点:

1. 由于R.drawable中的资源ID都是public的静态变量,因此,可直接使用Field.get方法获得这些变量的值。如果是private或protected的变量,需要field.setAccessible(true)设置变量值的访问权限才可以读写这些变量。

2. 使用Field.get方法获得变量值时,如果是静态变量。Field.get方法的参数值设为null即可。如果不是静态变量,需要为Field.get方法指定一个变量所在类的对象作为参数值。

3. 由于EditText类不能直接插入Span对象,因此,需要先使用SpannableString对象来封装Span对象(如本例中的ImageSpan对象),再将SpannableString对象插入到EditText控件中。

android表情加文字图片,Android开发技巧之像QQ一样输入文字和表情图像相关推荐

  1. android studio 加载图片,Android Studio 加载网络图片

    Android Studio是基于gradle的一个Android开发软件,在引用网络图片的时候需要连接第三方库,这里介绍 引用glide的方法. 一.在github页面搜索glide,点击第一个 二 ...

  2. android webview 太大,Android应用开发之Android WebView加载图片显示过大的处理教程(代码教程)...

    本文将带你了解Android应用开发Android  WebView加载图片显示过大的处理教程(代码教程),希望本文对大家学Android有所帮助. Webview加载图片时,经常会遇到图片显示不符合 ...

  3. Android Glide加载图片时转换为圆形、圆角、毛玻璃等图片效果

     Android Glide加载图片时转换为圆形.圆角.毛玻璃等图片效果 附录1简单介绍了Android开源的图片加载框架.在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬 ...

  4. Android Glide加载图片成圆形

    今天,简单讲解android使用glide加载图片成圆形. 这个很简单,因为之前需要在RecyclerView里加载圆形图片,所以在网上查找了资料,很简单就解决了. 1.导入依赖 implementa ...

  5. android glide圆形图片,Android Glide加载图片成圆形

    释放双眼,带上耳机,听听看~! 今天,简单讲解android使用glide加载图片成圆形. 这个很简单,因为之前需要在RecyclerView里加载圆形图片,所以在网上查找了资料,很简单就解决了. 1 ...

  6. Android Glide加载图片、网络监听、设置资源监听

    Glide加载图片.加载进度监听 前言 正文 一.项目配置 二.显示网络图片 三.添加设置资源监听 四.添加设置资源监听 五.添加加载进度条 六.封装工具类 七.源码 总结 前言   在日常开发中使用 ...

  7. android viewpager动态加载图片,Android使用ViewPager加载图片和轮播视频

    作为Android基础组件之一,大家对viewpager已经很熟悉了,网上也有很多使用viewpager来加载图片的案例.但是像微信那样点击图片,可以轮播显示图片和视频的例子却没找到.正巧项目中有需求 ...

  8. android画圆形背景图片,android圆形图片,圆形背景文字的CircleTextImageView开源组件...

    转[http://blog.csdn.net/ys408973279/article/details/50350313] 在项目中我们经常遇到需要显示圆形头像的需求,一般我们都使用hdodenhof/ ...

  9. 演化理解 Android 异步加载图片

    引用:http://www.cnblogs.com/ghj1976/archive/2011/05/06/2038738.html 下面测试使用的layout文件: 简单来说就是 LinearLayo ...

最新文章

  1. 2021年9月最新的保姆级计算机视觉学习路线
  2. MMDetection3D:新一代通用3D目标检测平台
  3. Java_压缩与解压工具类
  4. LineatLayout设置背景为.9图后产生位移
  5. SQLAlchemy 中的 Session、sessionmaker、scoped_session
  6. 阿里服务器降温系统,双十一服务器靠“泡澡”降温?阿里看上了3M的这项“冷”科技...
  7. iBATIS使用$和#的一些理解
  8. 排序----在线性时间内排序
  9. SQL server 远程连接 1326错误
  10. p750服务器配置信息,P750的一些配置
  11. VB获取一个文件夹中指定的文件或文件夹名称到列表
  12. 已知特征多项式求所有对应的二阶矩阵
  13. python修改文件夹名字
  14. Android 10.0 SystemUI修改状态栏电池图标样式为横屏显示
  15. 方差缩减——分层抽样
  16. WinForm下多层架构的实现
  17. illegal multibyte sequence
  18. 有道单词导入 大量有道单词 生词本 批量导入 添加 有道单词XML 背单词
  19. Mac电脑安装win7系统,解决前端IE浏览器兼容性问题
  20. php文字转语音amr,如何将文字转成语音?这几个方法一分钟搞定!

热门文章

  1. windows相关知识点分析
  2. php去掉查询返回的字段序列号,php – 为返回的MySQL查询添加编号列表列
  3. g++编译时:No such file or directory
  4. C语言上证指数运行源码,个股对比上证指数公式源码
  5. mono linux c 服务,使用mono-service在Linux上包装Windows服务
  6. Android开发之activity跳转页面失败的问题
  7. java实现c#的datetime.ticks_java的Date.getTime()转换成C#的Datetime.ticks | 学步园
  8. linux下screen版本,在Linux (RHEL/CentOS 7/8 )中,如何使用4个简单步骤安装Screen命令
  9. html怎么一段时间把网页背景更换_复盛螺杆压缩机故障怎么维修?
  10. ios 防止按钮快速点击造成多次响应的避免方法。