8

我正在尝试解决我的问题 2 天,但没有任何成功。

问题是:当我将 BulletSpan 设置为文本然后在 EditText 中显示它时,一切正常,直到我开始输入另一个文本。当文本在屏幕末尾换行时,缩进起作用,但光标指向实际位置,并且在光标之后添加了上一行的一些字符。为了更好地说明这个问题,请参见附图。

跨度误差

还值得一提的是,这仅在我输入文本时发生,当我在源中设置文本并且文本太长而不能仅在一行上时,换行工作正常,没有添加额外的字符,也没有光标位置是错的。

我也尝试了LeadingMarginSpan.Standart,行为是一样的。

在代码中,我设置了开始标记:

private void handleListStart(SpannableStringBuilder text) {
    int len = text.length();
    text.setSpan(new ListItem(), len, len, Spannable.SPAN_MARK_MARK);
}

然后设置跨度:

private void handleListEnd(SpannableStringBuilder text) {
    int len = text.length();
    Object obj = getLast(text, ListItem.class);
    int where = text.getSpanStart(obj);

    text.removeSpan(obj);

    if (where != len) {
        text.setSpan(new BulletSpan(listIndent * 15), where, len, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    }
}

我正在从 xml 文件中获取数据。

谢谢你的帮助

编辑:我忘了补充一点,我已经在 Android 4.1 和 4.4 上尝试过,并且两者的行为相同

4

2 回答 2

1

当您的子弹样式字符换行时会发生此问题。

您可以在行数增加时收听,然后您可以清除项目符号并重新设置新的项目符号。

上面的解决方案对我来说非常有效。

于 2016-12-22T06:49:15.287 回答
0

@QuinnChen 的回答对我有用。为方便起见,让我用代码详细说明一下。当文本自动换行到 BulletSpan 和 LeadingMargin span 中的下一行时,会发生此问题。

解决方案是删除先前的跨度并在行增加时再次应用相同的跨度。

int line_counter = editorEditText.getLineCount();单击按钮以应用跨度时的第一个设置

然后在 textwatcher 的正文中写下:

if(line_count > editorEditText.getLineCount()){
                        LeadingMarginSpan[] leadingMarginSpans = editorEditText.getText().getSpans(0, editorEditText.getSelectionStart(),
                                LeadingMarginSpan.class);
                        int s , e;
                        for(LeadingMarginSpan ss: leadingMarginSpans){
                            s = editorEditText.getText().getSpanStart(ss);
                            e = editorEditText.getText().getSpanEnd(ss);
                            if(s<=editorEditText.getSelectionStart() && editorEditText.getSelectionStart()<=e){
                                editorEditText.getText().removeSpan(ss);
                                editorEditText.getText().setSpan(new LeadingMarginSpan.Standard(30), s,e,
                                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                                line_count = editorEditText.getLineCount();
                            }

                        }
                    }

当文本自动换行到下一行时,将执行此代码。

笔记:

这是LeadingMargin 的代码,bulletSpan 的解决方案是一样的,您只需将LeadingMarginSpan 更改为BulletSpan

于 2019-07-25T12:36:21.010 回答