0

私はSpannedText入っていて、EditTextテキストを笑顔に置き換えています。たとえば、クールを笑顔に置き換えています。しかし、Androidフォン(Nexus 5 kitkat 4.4.4)でBackspaceを押すと、「(Smile)cool」と表示され、最後に文字が削除され、笑顔自体が削除されます。ただし、Genymotionエミュレーターでは、必要に応じて機能します。コードの何が問題になっていますか?

このコードは

Drawable d = Drawable.createFromStream(ims, null);
                Bitmap b = ((BitmapDrawable)d).getBitmap();
                int spanSmileHeight = (displayHeight>displayWidth) ? ((int) ((double) displayHeight/25)) : ((int) ((double) displayWidth/25));
                int spanSmileWidth = ((int) ((double) spanSmileHeight/b.getHeight())*b.getWidth())+15;
                Bitmap bitmapResized = Bitmap.createScaledBitmap(b, spanSmileWidth, spanSmileHeight, false);
                Drawable sd = new BitmapDrawable(getResources(), bitmapResized);
                sd.setBounds(0, 0, spanSmileWidth, spanSmileHeight);
                addPattern(emoticons, smileyCode, sd);
...

ImageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        int start = Math.max(message.getSelectionStart(), 0);
                        int end = Math.max(message.getSelectionEnd(), 0);
                        message.getText().replace(Math.min(start, end), Math.max(start, end),
                                smileyCode, 0, smileyCode.length());
                        message.setText(getSmiledText(view.getContext(), message.getText()));
                        message.setSelection(start + smileyCode.length());

この

public static boolean addSmiles(Context context, Spannable spannable) {
        boolean hasChanges = false;
        for (Map.Entry<Pattern, Drawable> entry : emoticons.entrySet()) {
            Matcher matcher = entry.getKey().matcher(spannable);
            while (matcher.find()) {
                boolean set = true;
                for (ImageSpan span : spannable.getSpans(matcher.start(),
                        matcher.end(), ImageSpan.class))
                    if (spannable.getSpanStart(span) >= matcher.start()
                            && spannable.getSpanEnd(span) <= matcher.end())
                        spannable.removeSpan(span);
                    else {
                        set = false;
                        break;
                    }
                if (set) {
                    hasChanges = true;
                    spannable.setSpan(new ImageSpan(entry.getValue(), ImageSpan.ALIGN_BOTTOM),
                            matcher.start(), matcher.end(),
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
            }
        }
        return hasChanges;
    }

    public static Spannable getSmiledText(Context context, CharSequence text) {
        Spannable spannable = spannableFactory.newSpannable(text);
        addSmiles(context, spannable);
        return spannable;
    }

バックスペース前

バックスペースの前

(仮想キーボードの) バックスペースを押した後

バックスペースの後

ログ出力:

09-01 06:22:21.280    1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**cat*
09-01 06:23:32.060    1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**cat
09-01 06:23:32.080    1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**
09-01 06:23:32.084    1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**cat

あと3回

09-01 06:24:07.980    1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**ca
09-01 06:24:08.264    1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**c
09-01 06:24:08.668    1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**

そしてここで笑顔が削除されました

09-01 06:24:09.248    1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat*
4

1 に答える 1

0

これを防ぐ方法を見つけました。targetSDK を 15 に変更すると、笑顔が正常に削除されます。

于 2014-09-01T07:39:37.960 に答える