转载请注明出处:http://blog.csdn.net/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;@Overrideprotected 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() {@Overridepublic void onClick(View v) {String editTextString = mEditText.getEditableText().toString();CharSequence charSequence = sp.compileStringToDisply(editTextString);mTextView.append(charSequence);}};@Overridepublic boolean onCreateOptionsMenu(Menu menu) {menu.add(Menu.NONE, 123456, 0, R.string.add_smily);return true;}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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;}}



更多相关文章

  1. Android仿WIN8系统磁贴点击下沉倾斜效果
  2. android全屏显示
  3. Android全屏对话框(附带延时关闭效果)
  4. Android(安卓)Studio 第七十七期 - Android(安卓)广告页 欢迎页
  5. GridView 实现水平拖拉效果
  6. GridView 实现水平拖拉效果
  7. Activity半透明效果
  8. android 按钮的点击缩放
  9. 一个Android实现图片的倒影效果的代码示例

随机推荐

  1. 《Expert Android》关键点摘录之一:Explor
  2. How Android(安卓)Draws Views,Android如
  3. Android(安卓)Media Server - MediaPlaye
  4. Android开发-WebSocketWssDemo
  5. android学习小结4
  6. Android(安卓)Drawable工具类
  7. Android(安卓)获取手机的IMEI等设备信息
  8. android GPS JAVA应用程序编程-------获
  9. Android(安卓)终端上的开发工具
  10. Android(安卓)Bluetooth 文件接收路径修