2014-08-29 1 views
0

У меня есть SpannedText в EditText и я заменяю текст смайлами, например cool заменен на улыбку. Но когда я нажимаю Backspace на Android-телефоне (Nexus 5 kitkat 4.4.4), он показывает «(Smile) круто», после чего удаляет буквы, наконец, самой улыбкой. Но на Genymotion эмулятор работает по мере необходимости. Что не так с моим кодом?Android Spanned Текст при удалении улыбок показывает текст

Этот код будет находиться в

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

Перед bacspace

before backspace

После забой (виртуального keyobard) нажимается

after backspace

Выход журнала:

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* 
+0

ваш код? какой код? – pskink

+0

Я добавил код к вопросу. –

+0

Я обнаружил, что это происходит на Nexus 5 –

ответ

0

Я нашел способ, как предотвратить это. Если мы изменим targetSDK на 15, то улыбки удаляются успешно.