EditText + ImageSpan跨行时消失

11
我正在使用一个自定义的EditText类,支持通过用户输入插入图像跨度到特定小部件中,但遇到了奇怪的问题。当图像跨度出现在一行的末尾时,换行有时会导致图像跨度不再可见。
例如,在此之前: Before the issue 在我完成输入“not working.”后,编辑文本将显示如下: After issue is produce 基本上,当涉及到将图像跨度移动到多行EditText中的下一行时,EditText似乎无法正确处理它。当被带到下一行时,它对用户来说是不可见的。我可以删除第二个图像的内容,直到它看起来与第一个图像完全相同(到“n”),然后我们就能再次看到图像跨度。

有人知道我可以做什么来解决这个问题吗?这是一个我想在我的应用程序中保留的关键组件。我也不能回退到单行编辑文本,多行支持也是至关重要的。

为了可重复性,这是我添加ImageSpan到我的编辑文本的代码:

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

我只有几个图标,用户可以按下它们,通过Spannable将图像嵌入自定义EditText中。我使用文本映射到可绘制对象的映射表,以便在用户按下特定按钮时知道要使用哪个图标。主要问题是,如果EditText中有ImageSpan,在触发新行时可能会变为不可见状态。
2个回答

7

我遇到了与EditText相同的问题。

如前面的评论所述,这是由于空格字符导致的。当EditText换行时,如果前一行的最后一个字符是空格,则该组件会删除前一行的最后一个字符。因此,要避免出现这种情况,我们需要使用不同的字符。

在以前的代码中,我们有:

 editable = editable.insert(start, SPACE);

我们应该使用以下代码来代替:

editable = editable.insert(start, anyCharacter);

anyCharacter代表任何非空格字符。


哇,你救了我伙计。我也遇到了一个TextView的问题,换行后它丢失了应该被替换为ImageSpans的空格。真是太神奇了,你找出了这个问题。谢谢! - Vucko

0

在 setSpan 之前放置此代码:

spannableStringBuilder.append("\r");

你找到解决方案了吗?我也遇到了同样的问题。我想听听这个问题的解决方案。 - rawcoder064
我已经解决了这个问题。问题是文本视图修剪了第一个和最后一个空格。如果您添加一个字符而不是空格,它将得到解决。无论如何,谢谢。 - rawcoder064

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接