I'm using a custom EditText class that supports input of image spans via user input for a particular widget, and experiencing a strange issue. When the image span appears at the end of a a line, the carry over to the next line sometimes causes the image span to no longer be visible.
i.e before:
after I finish typing "not working." the edit text appears like so:
Basically, it appears the image span isn't properly handled by the edittext when it comes to moving it to the next line in a multi-line edittext. It is just invisible to the user after being carried over. I can backspace the second image's content until it looks exactly like the first image (to the "n") and we see the image span again.
Anyone know what I can do to solve this? It's a critical component I'd like to keep in my application. I also can't fallback to a single line edit text, the multiline support is also critical.
For reproducibility, here is my code for adding the ImageSpan to my edit text:
public void appendSpannedText(String s){
if (textToDrawableMap == null || textToDrawableMap.isEmpty()
|| !textToDrawableMap.containsKey(s)) {
return;
}
// Acquire the mapped drawable
Drawable drawable = textToDrawableMap.get(s);
Editable editable = getText();
int start = getSelectionStart();
// Insert the a space at the start that's eaten by the image span
// being set.
editable = editable.insert(start, SPACE);
// Insert the new string at the starting point
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(editable);
// Create the span and set the new span to the appropriate range
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
int nextIdx = start + 1;
spannableStringBuilder.setSpan(span,
start, nextIdx,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// Update the spanned text and the cursor
setText(spannableStringBuilder);
setSelection(nextIdx);
}
I just have a few icons that a user can press and it insert's the image span to the custom edit text via spannable. I use a mapping of text -> drawables that I support so I know which one to use when a user presses a particular button. The main thing is if you have an imagespan in the edittext, it can become invisible on new line when triggered.
I was having the same problem with the EditText.
As a previous comment says, this happens because of the space character. When the EditText turns into a new line, the component removes the last character of the previous line, if this is a space. So, to avoid this to happen, we have to use a different one.
In the previous code we had this:
editable = editable.insert(start, SPACE);
Instead of this, we should write the next code:
editable = editable.insert(start, anyCharacter);
Where anyCharacter is a character different of " ".
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With