2013-06-01 2 views
0

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

Этот код используется для вставки смайлов в тексте:

Spanned cs = Html.fromHtml("<img src ='"+ index +"'/>", imageGetter, null);  

    int cursorPosition = content.getSelectionStart();   
    content.getText().insert(cursorPosition, cs); 

Это работает прекрасно. Смайлы появляются в текстовом окне в нужном месте.

Теперь я хочу отправить текст на свой сервер через HTTP. Я хотел бы сохранить «:)» вместо изображения, как для тех, кто использует более старую версию приложения, изображение не может быть отображено. В новой версии я конвертирую «:)» в изображение перед отображением текста. Есть ли способ конвертировать изображение в определенную строку?

+0

- это ресурсоемкие ресурсы для смайликов? R.drawable.something? – Blackbelt

+0

У меня есть они в активе и в доступных папках. Так да! – tobias

+0

сохранить HashMap , где ключ - это целое число, связанное с вашим смайликом – Blackbelt

ответ

1

если вы хотите заменить смайлики попробовать это:

EditText et = new EditText(this); 
et.setTextSize(24); 
et.setHint("this view shows \":)\" as an emoticon, try to type \":)\" somewhere"); 
final Bitmap smile = BitmapFactory.decodeResource(getResources(), R.drawable.emo_im_happy); 
final Pattern pattern = Pattern.compile(":\\)"); 
TextWatcher watcher = new TextWatcher() { 
boolean fastReplace = true; 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     //Log.d(TAG, "onTextChanged " + start + " " + before + " " + count); 
     if (fastReplace) { 
      if (start > 0 && count > 0) { 
       String sub = s.subSequence(start - 1, start + 1).toString(); 
       if (sub.equals(":)")) { 
        Spannable spannable = (Spannable) s; 
        ImageSpan smileSpan = new ImageSpan(smile); 
        spannable.setSpan(smileSpan, start-1, start+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       } 
      } 
     } else { 
      Spannable spannable = (Spannable) s; 
      Matcher matcher = pattern.matcher(s); 
      while (matcher.find()) { 
       int mstart = matcher.start(); 
       int mend = matcher.end(); 
       ImageSpan[] spans = spannable.getSpans(mstart, mend, ImageSpan.class); 
       Log.d(TAG, "onTextChanged " + mstart + " " + mend + " " + spans.length); 
       if (spans.length == 0) { 
        ImageSpan smileSpan = new ImageSpan(smile); 
        spannable.setSpan(smileSpan, mstart, mend, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       } 
      } 
     } 
     Log.d(TAG, "onTextChanged " + s); 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     Log.d(TAG, "afterTextChanged " + s); 
    } 
}; 
et.addTextChangedListener(watcher); 

setContentView(et); 

здесь, если fastReplace == true вам не придется сканировать весь текст, но это только минимальная реализация: работает только если вы наберете «)» сразу после набрал «:», если fastReplace == false заменяет каждое появление «:)» смайликом, но он должен сканировать весь текст, поэтому он немного медленнее, когда текст довольно большой.