Convert drawable to a specific string

2019-09-17 09:03发布

问题:

I have a chat app which I want to extend with emoticons.

This code is used to insert a smilie in the text:

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

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

This is working great. The smilies show up in the textView at the right place.

Now I want to send the text to my server via HTTP. I would like to store ":)" instead of the image as for ones using an older app version the image can not be displayed. In the new version I convert ":)" to the image before displaying the text. Is there any way to convert the image to a specific string?

回答1:

if you want to replace your emoticons try this:

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

here if fastReplace == true you don't have to scan the whole text but it's only minimal implementation: works only if you type ")" right after typed ":", if fastReplace == false it replaces every occurrence of ":)" with a smiley but it has to scan the whole text so it's a bit slower when text is quite large