使用bulletspan时换行不正确

时间:2014-02-11 13:19:54

标签: android text textedit spannablestring

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

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

Span Error

另外值得一提的是,只有当我输入文本时才会发生这种情况,当我在源文本中设置文本并且文本太长而不能只在一行上时,包装工作正常并且不会添加额外的字符也不会光标位置错误。

我也尝试过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上尝试了这个,并且两者表现相同

2 个答案:

答案 0 :(得分:0)

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

您可以在线条增加时收听,然后您可以清除子弹盘并再次设置新的子弹盘。

上面的解决方案非常适合我。

答案 1 :(得分:0)

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

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

点击按钮应用跨度时首先设置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