EditText和TextView一样,也可以进行图文混排。所不同的是,TextView只用于显示图文混排效果,而EditText不仅可显示, 也可混合输入文字和图像,让我们先回顾一下图5.2所示的QQ聊天输入框,在输入框中可以同时输入文字和表情图像。实际上,这种效果在Android SDK中只需要几行代码就可以实现。为了使读者更有学习的冲动,先来欣赏一下即将实现的效果,如下图所示。
在EditText控件中输入文字和图像
为了实现这个程序,首先来准备一些要用到的素材,也就是要在EditText控件中输入的图像文件。本例准备了9个png图像文件(face1.png至face9.png),都放在了res\drawable目录中。
接下来在屏幕上放一个只能显示3行(可输入多行)的EditText和一个Button,布局文件的代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <EditText android:id="@+id/edittext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:lines="3" android:gravity="left|top"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="随机插入表情" android:onClick="onClick_RandomFace" android:layout_marginTop="10dp" /> </LinearLayout>
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) { } }