上篇说道已经实现了点击qq表情,EditText上就能显示qq表情图标,而不是表情的符号。
但是没有这样的功能,输入比如说88的表情的代号;88,然后就出现。项目里面老大实现了这个功能,我也就拿出来分享一下。
这样的话,就必须自己实现TextWatcher这个接口,让EditText注册监听器,监听用户输入的字符是否是表情的代号,如果是则显示表情,如果不是就让他显示文字就ok
这里面就必须实现怎样判断表情代号的算法。(这个就不能分享了,因为不是我设计的)
我就TextWatcher和GridView的实现好了
ChatEmotion上篇就已经解释了,这里就不多废口舌了
mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
int currentPos = mEditView.getSelectionStart();
mEditView.getText().insert(currentPos, ChatEmotion.EMO_SYMBOLS[position]);
// SpannableStringBuilder ssb = new SpannableStringBuilder();
// ssb.append(getImageSpannableString(position));
// mEditView.getText().insert(currentPos, SpannableString.valueOf(ssb));
mEditView.invalidate();
}
});
TextWatcher 监听器:
class Watcher implements TextWatcher{
// isChanged 标志位 防止setText造成StackOverflowError
private boolean isChanged = false;
int len ,st = 0;
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
if(isChanged){
return ;
}
len = s.length();
int focusStart = mEditView.getSelectionStart();
int focusEnd = mEditView.getSelectionEnd();
// Log.d(TAG, "focus start:"+focusStart);
// Log.d(TAG, "focus end:"+focusEnd);
// Log.d(TAG, "len:"+len);
st = focusStart >= focusEnd ? focusStart : focusEnd;
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if(isChanged){
return ;
}
if(len > s.length()){
return ;
}
String str = s.toString();
SpannableString ss = ChatEmotion.string2Symbol(SmileActivity.this, str);
Log.d(TAG, ss.toString());
isChanged = true;
mEditView.setText(ss);
isChanged = false;
mEditView.invalidate();
Log.d(TAG, "start:"+st);
Log.d(TAG, "len:"+len);
Log.d(TAG, "length:"+s.length());
//光标定位,setText只会让光标放在0位置
mEditView.setSelection(s.length()-len+st);
}
}
ChatEmotion.string2Symbol(SmileActivity.this, str);这个函数封装了算法设计,我就不分享了,提示一下:就是把输入的字符串转成字符数组,然后使用循环,一个个比较表情代号字符,有点类似字符匹配。呵呵,就此为止吧