3

Edittextで絵文字を表示するためにAndroidで絵文字を表示するという回答からこのコードを入力しましたが、大量のテキストを入力すると問題が発生し、入力が遅くなり、ほとんど不可能になります。これはコードです:どうすればそれをより速くすることができますか?

 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;
        }
4

2 に答える 2

2

最後の2文字だけをスキャンするようにするにはどうすればよいですか?

あなたが持っている:

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

毎回文字列全体をスキャンしたくない場合は、より適切な開始値を選択してindexください。

たとえば、最小長の絵文字には2文字、最大長の絵文字には5文字があるためEditable、長さが0または1のオブジェクトのループを完全にスキップしてindexから、で開始しs.length()-5ます。

ただし、これafterTextChanged()は最後に変更が必要なだけではないことに注意してください。ユーザーがカーソルを中央のどこかに再配置した可能性があります。したがって、実際onTextChanged()には、変更のポイントの周りのテキストのウィンドウをスキャンして確認する必要があります。

于 2012-09-26T15:13:18.390 に答える
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つの位置をループするまで、最後の要素から逆方向にループを開始します。

于 2012-10-26T18:00:18.530 に答える