转载请注明出处:http://blog.youkuaiyun.com/droyon/article/details/8526271
先来看看效果:

MyAppActivity.java
package com.android.myappforone;
import java.util.HashMap;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.telephony.PhoneNumberUtils;
import android.text.Editable;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class MyAppActivity extends Activity{
private static final String TAG = "MyApp";
private TextView mTextView;
private EditText mEditText;
private Button mButton ;
private SmilyParse sp;
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.show);
mContext = MyAppActivity.this;
sp = new SmilyParse(mContext);
mTextView = (TextView)findViewById(R.id.show_smily);
mEditText = (EditText)findViewById(R.id.inpute_smily);
mButton = (Button)findViewById(R.id.send);
mButton.setOnClickListener(ocl);
}
View.OnClickListener ocl = new View.OnClickListener() {
@Override
public void onClick(View v) {
String editTextString = mEditText.getEditableText().toString();
CharSequence charSequence = sp.compileStringToDisply(editTextString);
mTextView.append(charSequence);
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(Menu.NONE, 123456, 0, R.string.add_smily);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case 123456:
showSmilyAlertDialog();
break;
}
return true;
}
public void showSmilyAlertDialog(){
final SimpleAdapter simpleAdapter = new SimpleAdapter(mContext, sp.getData(), R.layout.smiley_menu_item,
new String[]{"icon","name","text"}, new int[]{R.id.smiley_icon,R.id.smiley_name,R.id.smiley_text});
SimpleAdapter.ViewBinder binder = new SimpleAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Object data,
String textRepresentation) {
if(view instanceof ImageView){
Drawable d = getResources().getDrawable(((Integer)data));
((ImageView)view).setImageDrawable(d);
return true;
}
return false;
}
};
simpleAdapter.setViewBinder(binder);
AlertDialog.Builder alb = new AlertDialog.Builder(mContext);
alb.setTitle("Smily Icon");
alb.setAdapter(simpleAdapter, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
HashMap<String ,Object> map = (HashMap<String, Object>) simpleAdapter.getItem(which);
String text = (String) map.get("text");
CharSequence charSequence = sp.compileStringToDisply(text);
Log.d(TAG,"insert charsequence"+charSequence);
Editable editAble = mEditText.getEditableText();
int start = mEditText.getSelectionStart();
int end = mEditText.getSelectionEnd();
Log.d(TAG,"insert start and end "+start+"--"+end+"editText length"+mEditText.length());
if(start<0 || end >= mEditText.length()){
editAble.append(charSequence);
}else{
// mEditText.append(charSequence, start, charSequence.length());
editAble.insert(start, charSequence);
}
// dialog.dismiss();
}
});
alb.create().show();
}
}
SmilyParse.java
package com.android.myappforone;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.PhoneNumberUtils;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class SmilyParse {
private Context mContext;
private Pattern mPattern;
private String[] mResArrayName;
private String[] mResArrayText;
private Map<String ,Integer> mResToIcons;
private List<Map<String,?>> data = new ArrayList<Map<String,?>>();
public SmilyParse(Context context){
mContext =context;
mResArrayName = context.getResources().getStringArray(Smily.DEFAULT_SMILY_NAMES);
mResArrayText = context.getResources().getStringArray(Smily.DEFAULT_SMILY_TEXT);
mResToIcons = buileResToDrawableMap();
mPattern = buildPattern();
data = buileMap();
}
private HashMap<String,Integer> buileResToDrawableMap(){
if(mResArrayText.length != Smily.DEFAULT_SMILY_ICONS.length){
throw new IllegalStateException("length is Illegal");
}
HashMap<String,Integer> map = new HashMap<String,Integer>();
for(int i=0;i<mResArrayText.length;i++){
map.put(mResArrayText[i], Smily.DEFAULT_SMILY_ICONS[i]);
}
return map;
}
private Pattern buildPattern(){
StringBuilder sb = new StringBuilder();
sb.append('(');
for(int i=0;i<mResArrayText.length;i++){
sb.append(Pattern.quote(mResArrayText[i]));
sb.append('|');
}
sb.replace(sb.length() -1, sb.length(), ")");
return Pattern.compile(sb.toString());
}
private List<Map<String,?>> buileMap(){
List<Map<String,?>> listMap = new ArrayList<Map<String,?>>();
for(int i=0;i<mResArrayName.length;i++){
HashMap<String,Object> entry = new HashMap<String,Object>();
entry.put("icon", Smily.DEFAULT_SMILY_ICONS[i]);
entry.put("name", mResArrayName[i]);
entry.put("text", mResArrayText[i]);
listMap.add(entry);
}
return listMap;
}
static class Smily{
public static final int DEFAULT_SMILY_TEXT = R.array.default_smiley_texts;
public static final int DEFAULT_SMILY_NAMES = R.array.default_smiley_names;
private static final int[] DEFAULT_SMILY_ICONS = {
R.drawable.emo_im_happy,
R.drawable.emo_im_sad,
R.drawable.emo_im_winking,
R.drawable.emo_im_tongue_sticking_out,
R.drawable.emo_im_surprised,
R.drawable.emo_im_kissing,
R.drawable.emo_im_yelling,
R.drawable.emo_im_cool,
R.drawable.emo_im_money_mouth,
R.drawable.emo_im_foot_in_mouth,
R.drawable.emo_im_embarrassed,
R.drawable.emo_im_angel,
R.drawable.emo_im_undecided,
R.drawable.emo_im_crying,
R.drawable.emo_im_lips_are_sealed,
R.drawable.emo_im_laughing,
R.drawable.emo_im_wtf,
R.drawable.emo_im_heart,
R.drawable.emo_im_mad,
R.drawable.emo_im_smirk,
R.drawable.emo_im_pokerface
};
}
public List<Map<String,?>> getData(){
return data;
}
public CharSequence compileStringToDisply(String text){
SpannableStringBuilder sb = new SpannableStringBuilder(text);
Matcher m = mPattern.matcher(text);
while(m.find()){
int resId = mResToIcons.get(m.group());
sb.setSpan(new ImageSpan(mContext,resId), m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return sb;
}
}
本文介绍了一个简单的表情解析器实现方案,该方案通过正则表达式匹配文本中的表情符号,并将其转换为相应的图像显示。此外,还提供了一个用户界面用于选择表情并插入到输入框中。
248

被折叠的 条评论
为什么被折叠?



