1. 程式人生 > >edittext 插入表情(基於socket方式)

edittext 插入表情(基於socket方式)

大家在用android版的qq時候一定見過有傳送表情這樣一個功能,我們知道類似qq這樣的即時通訊軟體基本上都是通過socket方式實現的,在網上找了找有些網友已經實現了在edittext裡面插入表情,但是真正基於 socket實現的還真沒找到,在很一些網友幫助下加上自己的摸索終於實現了基於socket方式傳送表情,今天我把它分享給大家,希望能幫助需要的人,幫助你就是幫助我!

1.首先你要準備好你的表情圖片啦,我找了一些作為例子演示,把所有的表情圖片放到res/drawable資料夾裡面,至於表情的名字大家可以隨便起,但是為了方便,最好是比較統一的格式,例如 face1,face2 ...,因為我實現的方式是在一個girdview裡面顯示這些表情,使用者點選某個後就插入到edittext裡面所以應該是如下圖所示:



相信這個介面應該不難搞吧,要是搞不定了網上找找例子啊,這裡就不多說了。然後再宣告一個數組這個數組裡面放的都是圖片的id 如下:

1 public static Integer[] mThumbIds = {
2 R.drawable.face01,
3 R.drawable.face02,
4 R.drawable.face03,
5 R.drawable.face04
6 }

你把你所有的圖片都放進去。

2 .在girdview控制元件的setOnItemClickListener方法裡面我們需要寫如下程式碼:

01 gridShowFace.setOnItemClickListener(
new OnItemClickListener() {
02 public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
03 ImageGetter imageGetter = new ImageGetter() {
04 public Drawable getDrawable(String source) {
05 int id = Integer.parseInt(source);
06 Drawable d = getResources().getDrawable(id);
07 d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
08 return d;
09 }
10 };
11
12 CharSequence cs = Html.fromHtml("<img src='" + mThumbIds[position]+ "'/>",imageGetter, null);
13 etContent.getText().append(cs);
14 faceContent =FilterHtml(Html.toHtml(etContent.getText()));
15
16 }
17 });

程式碼分析:

在setOnItemClickListener裡面 我們先例項化一個ImageGetter,ImageGetter是什麼大家自己查查,我也不知道怎麼定義它,這裡我們可以理解為通過它可以把 edittext裡面的html標籤替換為圖片的一個方法(不知道這樣解釋對不對),然後通過Html.fromHtml把它轉換成文字格式,這個方法裡面的 mThumbIds[position] 解釋下,mThumbIds就是放圖片id的陣列,position就是你點選的id,這樣就能得到圖片的id了,得到的id 是一個16進位制的字串,也就是在 R檔案裡面系統自動生成的類似 “0x7f020009”這樣的, 再通過 etContent.getText().append(cs) 附加給edittext 此時你可以試試,點選一個圖片後就顯示在edittext裡面了。顯示是沒問題了,但是這裡我們需要注意下,雖然顯示成功了,但是現在要是你打印出 edittext的text 裡面肯定有個OBJ的小圖示,我們發出去後也是顯示那個樣子,我們是要通過socket發出去的,所以我們不能直接傳送edittext.gettext()的值,這時候我們需要用一個方法過濾一下才能發,我們還需要一個方法 如下:

1 public static String FilterHtml(String str){
2 str = str.replaceAll("<(?!br|img)[^>]+>", "").trim();
3 return str;
4 }

於是有個這句程式碼:faceContent =FilterHtml(Html.toHtml(etContent.getText())); 這就是把edittext的內容過濾,除了br標籤和img標籤,其他都去掉後的內容,現在就可以傳送啦。注意:有些可能傳送後就會出現#&62137這樣編碼的內容,需要再轉碼一下,轉碼的方法也給大家貼上 如下:

01 public static String UnicodeToGBK2(String s){
02 String[] k = s.split(";") ;
03 String rs = "" ;
04 for(int i=0;i<k.length;i++) {
05 int strIndex=k.indexOf("&#");
06 String newstr = k;
07 if(strIndex>-1) {
08 String kstr = "";
09 if(strIndex>0) {
10 kstr = newstr.substring(0,strIndex);
11 rs+=kstr;
12 newstr = newstr.substring(strIndex);
13 }
14 int m = Integer.parseInt(newstr.replace("&#",""));
15 char c = (char)m ;
16 rs+= c ;
17 } else {
18 rs+=k;
19 }
20 }
21 return rs;
22 }

上面的就改為:

1 public static String FilterHtml(String str){
2 str = str .replaceAll("<(?!br|img)[^>]+>", "").trim();
3 return UnicodeToGBK2(str);
4 }

3.還有最後一步,發出去了還要顯示出來,

只需要在 介面卡的 getview 給 textview 繫結內容時處理一下原來是setViewText((TextView) v, text) 改成 Html.fromHtml(text,imageGetter, null), 同樣也需要 弄個 imageGetter物件出來就ok了。如圖: