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了。如圖: