当前位置: 代码迷 >> Android >> 安卓开发中如何使用emoji替换文本,有使用过这方面功能的来指点一下吧
  详细解决方案

安卓开发中如何使用emoji替换文本,有使用过这方面功能的来指点一下吧

热度:56   发布时间:2016-04-27 22:11:34.0
安卓开发中怎么使用emoji替换文本,有使用过这方面功能的来指点一下吧
现在知道的是使用SpannableString.setSpan()可以将准备好的文本替换成准备好的图片

问题是现在有几百个这样的emoji图片,是不是我要在资源文件中把这些图片(值)全部罗列出来,然后相应的文本(键)也全部罗列出来,然后在代码中获得这两个数列遍历找对应关系替换。

但是感觉这样图片数量很多时写起来也很麻烦,本人初学者也没接触过emoji这方面的东西,不知道有没有接触的前辈指点一下怎么做比较好呢,有没有什么更简便的方法。
------解决思路----------------------
图片名字已某一个特殊字母开头,然后利用反射方法,根据图片名字获取图片
例子:
package com.antex.www.chatter;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ImageSpan;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.SimpleAdapter;

import com.antex.R;

public class ChatEmoticons {

private Context mContext;
private EditText mEditText;
private Dialog mDialog;

private int[] mImageIds;
private List<Map<String, Object>> mListItems;

public ChatEmoticons(Context context, EditText editText) {
mContext = context;
mEditText = editText;

mImageIds = new int[107];
mListItems = new ArrayList<Map<String, Object>>();
init();
}

public void init() {
for (int i = 0; i < 107; i++) {
try {
if (i < 10) {
Field field = R.drawable.class.getDeclaredField("f00" + i);
int resourceId = Integer.parseInt(field.get(null)
.toString());
mImageIds[i] = resourceId;
} else if (i < 100) {
Field field = R.drawable.class.getDeclaredField("f0" + i);
int resourceId = Integer.parseInt(field.get(null)
.toString());
mImageIds[i] = resourceId;
} else {
Field field = R.drawable.class.getDeclaredField("f" + i);
int resourceId = Integer.parseInt(field.get(null)
.toString());
mImageIds[i] = resourceId;
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Map<String, Object> listItem = new HashMap<String, Object>();
listItem.put("image", mImageIds[i]);
mListItems.add(listItem);
}
}

public void createExpressionDialog() {
mDialog = new Dialog(mContext);
GridView gridView = createGridView();
mDialog.setContentView(gridView);
mDialog.setTitle("emoticons");
mDialog.show();
gridView.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Bitmap bitmap = null;
bitmap = BitmapFactory.decodeResource(mContext.getResources(),
mImageIds[arg2 % mImageIds.length]);
ImageSpan imageSpan = new ImageSpan(mContext, bitmap);
String str = null;
if (arg2 < 10) {
str = "f00" + arg2;
} else if (arg2 < 100) {
str = "f0" + arg2;
} else {
str = "f" + arg2;
}
SpannableString spannableString = new SpannableString(str);
// SpannableString spannableString = new
// SpannableString("an emo");
spannableString.setSpan(imageSpan, 0, 4,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mEditText.append(spannableString);
mDialog.dismiss();
}
});
}

/**
 * 生成一个表情对话框中的gridview
 * 
 * @return 表情对话框中的gridview
 */
private GridView createGridView() {
final GridView view = new GridView(mContext);

SimpleAdapter simpleAdapter = new SimpleAdapter(mContext, mListItems,
R.layout.cb0_chat_emoticon, new String[] { "image" },
new int[] { R.id.cb0_chat_emoticon_image });
view.setAdapter(simpleAdapter);
view.setNumColumns(6);
view.setBackgroundColor(Color.rgb(214, 211, 214));
view.setHorizontalSpacing(1);
view.setVerticalSpacing(1);
view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT));
view.setGravity(Gravity.CENTER);
return view;
}

}


调用
ChatEmoticons chatEmoticon = new ChatEmoticons(
ChatActivity.this, mEtInput);
chatEmoticon.createExpressionDialog();