像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>

效果图如下

posted @ 2014-03-31 19:48  我是不可不戒  阅读(215)  评论(0编辑  收藏  举报