像QQ一样输入表情图像
由于R.drawable中的资源ID都是public的静态变量,因此,可以直接使用Field.get方法获得这些变量的值。如果是private或protected的变量,需要field.setAccessible(true)设置变量值的访问权限才可以读写这些变量。
使用Field.get方法获得变量值是,如果是静态变量,Field.get方法的参数值设为null即可。如果不是静态变量,需要为Field.get方法指定一个变量所在类的对象作为参数值。
由于EditText类不能直接插入Span对象,因此,需要先使用SpannableString对象来封装Span对象(本例中的ImageSpan对象),再将SpannableString对象插入到EditText控件中。
代码如下
package com.exluohaibo.testdemo05; import java.lang.reflect.Field; import java.util.Random; import android.os.Bundle; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.text.Spannable; import android.text.SpannableString; import android.text.style.ImageSpan; import android.view.Menu; import android.view.View; import android.widget.EditText; public class MainActivity extends Activity { private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.edittext); } 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) { // TODO: handle exception } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
布局文件代码如下:
<?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>
效果图如下