首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在android的edittext中使用spannable

在android的edittext中使用spannable
EN

Stack Overflow用户
提问于 2012-09-26 18:57:33
回答 2查看 4K关注 0票数 3

我把这段代码放在answer Displaying emoticons in Android中,用来在编辑文本中显示表情符号,但当我键入大量文本时,我遇到了一个问题,它变得越来越慢,几乎不可能键入。这是代码:我怎样才能让它更快呢?

代码语言:javascript
复制
 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;
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-26 23:13:18

如何让它只扫描最后两个字符?

您必须:

代码语言:javascript
复制
for (index = 0; index < s.length(); index++)

如果不希望每次都扫描整个字符串,请为index. 选择一个更好的起始值

例如,由于最小长度图释具有两个字符,而最大长度图释具有五个字符,因此对于长度为0或1的Editable对象,请完全跳过该循环,然后让indexs.length()-5开始。

但是请注意,afterTextChanged()并不只是在最后才被调用来进行更改。用户可能已将光标重新定位到中间的某个位置。因此,您真的应该在onTextChanged()中扫描并查看变更点周围的文本窗口。

票数 2
EN

Stack Overflow用户

发布于 2012-10-27 02:00:19

为了扫描最后2个字符,而不是

代码语言:javascript
复制
for (index = 0; index < s.length(); index++)

使用

代码语言:javascript
复制
int start = s.length() - 1;
int end = start - 2;
for (index = start; index > end; index--)

这样,您就可以从最后一个元素开始向后循环,直到循环两个位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12600166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档