我把这个代码从回答Displaying emoticons in Android中用来在Edittext中显示表情符号,但是当我输入大量文本时我遇到了问题,它变得越来越慢,几乎不可能输入。 这是代码:如何让它更快?
textS.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
addSmiledText(Main.this, s);
// Log.e("",s.toString());
}
});}
private static final HashMap<String, Integer> emoticons = new HashMap<String, Integer>();
static {
emoticons.put(":)", R.drawable.face_smile);
emoticons.put(":-)", R.drawable.face_smile);
emoticons.put(":(", R.drawable.face_sad);
emoticons.put(":-(", R.drawable.face_sad);
emoticons.put(":-D", R.drawable.face_smile_big);
emoticons.put(":D", R.drawable.face_smile_big);
emoticons.put(":lol:", R.drawable.face_laughing);
emoticons.put("8)", R.drawable.face_cool);
emoticons.put(";)", R.drawable.face_wink);
emoticons.put(";-)", R.drawable.face_wink);
emoticons.put(";(", R.drawable.face_crying);
...
}
public static Spannable addSmiledText(Context ch, Editable s) {
int index;
for (index = 0; index < s.length(); index++) {
for (Entry<String, Integer> entry : emoticons.entrySet()) {
int length = entry.getKey().length();
if (index + length > s.length())
continue;
if (s.subSequence(index, index + length).toString().equals(entry.getKey())) {
s.setSpan(new ImageSpan(ch, entry.getValue()), index, index + length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
index += length - 1;
break;
}
}
}
return s;
}
答案 0 :(得分:2)
如何让它只扫描最后两个字符?
你有:
for (index = 0; index < s.length(); index++)
如果您不想每次都扫描整个字符串,为index
选择更好的起始值。
例如,由于您的最小长度表情符号有两个字符,并且您的最大长度表情符号有五个字符,因此对于长度为0或1的Editable
对象,请完全跳过循环,然后使用index
从s.length()-5
开始。
但请注意,afterTextChanged()
不仅要在最后调用更改。用户可能已将光标重新定位到中间的某个位置。因此,您真的应该在onTextChanged()
中进行扫描,并查看更改点周围的文本窗口。
答案 1 :(得分:0)
为了扫描最后2个字符而不是
for (index = 0; index < s.length(); index++)
使用
int start = s.length() - 1;
int end = start - 2;
for (index = start; index > end; index--)
这样你就可以从最后一个元素向后循环,直到你循环2个位置。