ImageSpan на EditText (смайлики ). Клавиатура SwiftKey не работает

Я делаю простое приложение для чата и хочу показывать смайлики в тексте редактирования при написании сообщения.

У меня есть это, чтобы определить, какие символы будут заменены изображением через ImageSpan (это вызывается только тогда, когда символ смайлика вставлен в EditText):

for (index = start; index < start+num_chars; index++) {
        if (index + 1 > editable.length())
            continue;  
          if(emoticons.containsKey(editable.subSequence(index, index + 1).toString())){
            int length=1; 

            Drawable drawable = context.getResources().getDrawable(emoticons.get(editable.subSequence(index, index + 1).toString()));
            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();


            int size=Utils.GetDipsFromPixel(context, (int)(textSize*1.3));

            Drawable d = new BitmapDrawable(Bitmap.createScaledBitmap(bitmap, size, size, true));
            int dWidth = d.getIntrinsicWidth();
            int dHeight = d.getIntrinsicHeight();

            d.setBounds(0, -dHeight, dWidth, 0);
            ImageSpan span;
            span = new ImageSpan(d,ImageSpan.ALIGN_BASELINE);
            editable.setSpan(span, index, index + length,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            index += length - 1;
          }

      }

Я использую тег SPAN _EXCLUSIVE _EXCLUSIVE для установки диапазона, но у меня проблемы с клавиатурой swiftkey, потому что, когда я вставляю смайлик в текст редактирования, все, что я пишу сразу после imageSpan, остается под изображением (как ПРОМЕЖУТОЧНЫЙ _ЭКСКЛЮЗИВНЫЙ _ВКЛЮЧИТЕЛЬНЫЙ ). С клавиатурой Android по умолчанию у меня нет этой проблемы.

Я хочу, чтобы приложение WhatsApp работало так же, как и смайлики в EditText.

Какие-либо предложения? Любые изменения, которые я должен внести в свой код?

РЕДАКТИРОВАТЬ :В метод передается "редактируемая" переменная. Это значение txtMessage.getText (), где txtMessage — это EditText.

Спасибо!

РЕДАКТИРОВАТЬ :Охват только одной части кода! Это хорошо работает в многострочном режиме! Я думаю, что проблема заключалась в использовании Drawable -> Bitmap -> ResizedBitmap -> Drawable.

public static final HashMap<String, Integer> emoticons = new HashMap();
static {
    emoticons.put("\ue415", R.drawable.e415);
    emoticons.put("\ue056", R.drawable.e056);
    emoticons.put("\ue057", R.drawable.e057);
...
public static Spannable getSmiledText(Context context, Spannable editable,
        int start, int num_chars, float textSize) {

    int index;
    for (index = start; index < start + num_chars; index++) {
        if (index + 1 > editable.length())
            continue;
        if (EmojiLayout.emoticons.containsKey(editable.subSequence(index,
                index + 1).toString())) {
            int length = 1;

            Bitmap smiley = BitmapFactory.decodeResource(context.getResources(), ((Integer) EmojiLayout.emoticons.get(editable.subSequence(index,
                    index + 1).toString())));
            int size = Utils.GetDipsFromPixel(context,
            (int) (textSize * 1.37));

            Bitmap scaledbmp=Bitmap.createScaledBitmap(
                    smiley, size, size, false);
            ImageSpan span;
            span = new ImageSpan(scaledbmp);
            Log.d("EmojiLayout", "Index: " + String.valueOf(index) + "To: "
                    + String.valueOf(index + length));
            editable.setSpan(span, index, index + length,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            index += length - 1;
        }
    }
    return editable;
}
6
задан Igor 31 July 2012 в 22:44
поделиться