【问题标题】:Using spannable in edittext in android在android的edittext中使用spannable
【发布时间】:2012-09-26 10:57:32
【问题描述】:

我从答案 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;
        }

【问题讨论】:

  • 当您使用 Traceview 分析您的代码时,您发现了什么?
  • 感谢您的回答。我没有使用 Traceview。你觉得我应该吗?你能提供一些链接来看看如何做到这一点吗?
  • developer.android.com/tools/debugging/debugging-tracing.html 你会发现一次扫描一个字符通过整个字符串并不是查看最后输入的字符是否以某种方式创建表情符号的非常有效的方法。
  • 我知道这效率不高,但如何让它只扫描最后两个字符?例如,我插入“ab”它扫描=ab,然后我添加“c”=“abc”它只扫描bc。
  • 也许你应该看看使用TransformationMethod,它似乎是为这类事情设计的?

标签: android hashmap android-edittext textwatcher spannable


【解决方案1】:

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

你有:

for (index = 0; index < s.length(); index++)

如果您不想每次都扫描整个字符串,为index选择一个更好的起始值。

例如,因为您的最小长度表情符号有两个字符,而您的最大长度表情符号有五个字符,所以对于长度为 0 或 1 的 Editable 对象完全跳过循环,然后让 index 从 @987654325 开始@。

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

【讨论】:

  • 感谢您的指导,我会尝试这样设置。再一次感谢你。 :)
  • 好的,我尝试了两天让它工作,但没有...如果我可以将其设置为 s.length()-5 的范围,它不会显示表情符号。它只能像我上面发布的那样以这种方式工作,但速度很慢。所以我真的不知道该怎么办了。也许我应该以完全不同的方式尝试一下,你觉得呢?这是一种不好的方法吗?
  • @Natasa.M:我从未尝试过实现表情转换器算法。话虽如此,其他人已经实现了它们,可能数百次,所以我将专注于寻找一种有效的现有算法。
【解决方案2】:

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

for (index = 0; index < s.length(); index++)

使用

int start = s.length() - 1;
int end = start - 2;
for (index = start; index > end; index--)

这样你开始从最后一个元素向后循环,直到你循环了 2 个位置。

【讨论】:

    猜你喜欢
    • 2021-07-10
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2022-10-18
    • 2017-12-20
    • 2013-07-06
    相关资源
    最近更新 更多