android如何在textview或edittext上添加表情

先上效果图:



首先来写一个表情的GridView

public class EmotionView extends LinearLayout implements OnItemClickListener {

	private GridView mGridView;
	private static final ArrayList<Integer> emotionDisplayList = new ArrayList<Integer>();
	public static final LinkedHashMap<Integer, String> emotionsKeySrc = new LinkedHashMap<Integer, String>();
	public static final HashMap<String, Integer> emotionsKeyString = new HashMap<String, Integer>();

	private class GridViewAdapter extends BaseAdapter {

		List<Integer> list;
		
		public GridViewAdapter(List<Integer> list) {
			super();
			this.list = list;
		}
		
		public int getCount() {
			return list.size();
		}

		public Object getItem(int position) {
			return list.get(position);
		}

		public long getItemId(int position) {
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			int resId = (Integer) getItem(position);
			ImageView iv = null;
			if (convertView == null) {
				iv = (ImageView) (convertView = new ImageView(getContext()
						.getApplicationContext()));
			}
			else {
				iv = (ImageView) convertView;
			}
			iv.setImageResource(resId);
			iv.setBackgroundResource(R.drawable.bg_face);
			int height = getResources().getDimensionPixelSize(
					R.dimen.emotion_item_view_height);
			iv.setPadding(0, height, 0, height);
			return iv;
		}
		
	}
	static {

		emotionsKeySrc.put(R.drawable.face1, "怒");
		emotionsKeySrc.put(R.drawable.face2, "蛋糕");
		emotionsKeySrc.put(R.drawable.face3, "蜡烛");
		emotionsKeySrc.put(R.drawable.face4, "干杯");
		emotionsKeySrc.put(R.drawable.face5, "抓狂");
		emotionsKeySrc.put(R.drawable.face6, "衰");
		emotionsKeySrc.put(R.drawable.face7, "晕");
		emotionsKeySrc.put(R.drawable.face8, "粽子");
		emotionsKeySrc.put(R.drawable.face9, "风扇");
		emotionsKeySrc.put(R.drawable.face10, "花");
		emotionsKeySrc.put(R.drawable.face11, "足球");
		emotionsKeySrc.put(R.drawable.face12, "绿丝带");
		emotionsKeySrc.put(R.drawable.face13, "哼");
		emotionsKeySrc.put(R.drawable.face14, "心");
		emotionsKeySrc.put(R.drawable.face15, "冰棍");
		emotionsKeySrc.put(R.drawable.face16, "哈哈");
		emotionsKeySrc.put(R.drawable.face17, "爱你");
		emotionsKeySrc.put(R.drawable.face18, "月亮");
		emotionsKeySrc.put(R.drawable.face19, "猪头");
		emotionsKeySrc.put(R.drawable.face20, "下雨");
		emotionsKeySrc.put(R.drawable.face21, "红牌");
		emotionsKeySrc.put(R.drawable.face22, "泪");
		emotionsKeySrc.put(R.drawable.face23, "哨子");
		emotionsKeySrc.put(R.drawable.face24, "困");
		emotionsKeySrc.put(R.drawable.face25, "呵呵");
		emotionsKeySrc.put(R.drawable.face26, "阳光");
		emotionsKeySrc.put(R.drawable.face27, "汗");
		emotionsKeySrc.put(R.drawable.face28, "黄牌");
		emotionsKeySrc.put(R.drawable.face29, "嘻嘻");
		emotionsKeySrc.put(R.drawable.face30, "伤心");
	

		Iterator<Integer> iterator = emotionsKeySrc.keySet().iterator();
		int i = 0;
		while (iterator.hasNext()) {
			int temp = iterator.next();
			emotionsKeyString.put(emotionsKeySrc.get(temp), temp);
			emotionDisplayList.add(temp);
			i++;
		}
	}

	public interface EmotionAdapter {
		void doAction(int resId, String desc);
	}

	public EmotionView(Context context) {
		super(context);
		initViews();
	}

	public EmotionView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initViews();
	}

	private void initViews() {
		Context context = getContext();
		LayoutInflater.from(context).inflate(R.layout.emotion_main, this);
		mGridView = (GridView) findViewById(R.id.gridView);
		mGridView.setAdapter(new GridViewAdapter(emotionDisplayList));
		mGridView.setOnItemClickListener(this);
	}

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
		int value = emotionDisplayList.get(position);
		listener.onclick(value);
	}
	
	MyListener listener;


	public void setListener(MyListener listener) {
		this.listener = listener;
	}

}

Layout是:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="wrap_content"
	android:layout_height="@dimen/emotion_view_height"
	android:background="#d1d8e3" >

	<GridView
		android:id="@+id/gridView"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		android:numColumns="@integer/emotion_colnum"
		android:cacheColorHint="@null"
		android:stretchMode="columnWidth"
		android:listSelector="#00000000"
		android:fadingEdgeLength="0dp" >
	</GridView>

</RelativeLayout>


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

   <com.example.weibotest.view.EmotionView
		android:id="@+id/emotion_view"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_centerInParent="true"
		/>
   
   <EditText 
       android:id="@+id/textview"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_marginLeft="10dp"
		android:layout_marginRight="10dp"
		android:textSize="18sp"
		android:textColor="#000000"
		android:layout_marginBottom="10dp"
		android:layout_above="@id/emotion_view"
       />
</RelativeLayout>

Activity里这样来写:

  EmotionView mEmotionView;
   
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		final TextView textView = (TextView)findViewById(R.id.textview);
		mEmotionView = (EmotionView) findViewById(R.id.emotion_view);
		
		textView.setText("<strong>a[晕]dfsfdf[阳光]ds</strong>");
		String str1 = textView.getText().toString();
		SpannableString spannableString = new SpannableString(str1);
		Pattern pattern = null;
<strong>	      pattern = Pattern.compile("\\[(\\S+?)\\]");  //这里是过滤出[XX]这种形式的字符串,下面是把这种形式的字符串替换成对应的表情
</strong>		Matcher matcher = pattern.matcher(str1);
		Integer drawableSrc = null;
		while (matcher.find()) {
			int start = matcher.start();
			int end = matcher.end();
			drawableSrc = EmotionView.emotionsKeyString.get<strong>(matcher.group(1))</strong>;
			if (drawableSrc != null && drawableSrc > 0) {
				<strong>spannableString.setSpan(new ImageSpan(MainActivity.this, drawableSrc), start, end,
						Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);</strong>
			}
		}
		textView.setText(spannableString,TextView.BufferType.SPANNABLE);
		
		mEmotionView.setListener(new MyListener() {
			
			@Override
			public void onclick(int value) {
				String str1 = textView.getText().toString();
				SpannableString str = new SpannableString(str1);
				if (value > 0) {
					str.setSpan(new ImageSpan(MainActivity.this, value), 4, 5,
							Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
					textView.setText(str,TextView.BufferType.SPANNABLE);
				}
			}
		});


代码:http://download.csdn.net/detail/baidu_nod/7697419

猜你喜欢

转载自blog.csdn.net/baidu_nod/article/details/38310729