奇怪的TagHandler行为检测开关标签

时间:2014-05-09 15:28:51

标签: android textview

我正在尝试使用TextView显示带有自定义标记的字符串文本:

字符串:

"<articlelink>text1</articlelink> padding<articlelink>text2</articlelink>"

其中articlelink是自定义标记。我使用自定义的HTML.TagHandler来处理标记:

private class MyTagHandler implements Html.TagHandler {

    private int startIndex = 0;
    private int endIndex = 0;

    @Override
    public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
        if (tag.equals("articlelink")) {
            if (opening) {
                startIndex = output.length();
                DebugLog.d("OPEN " + startIndex);
            } else {
                endIndex = output.length();
                DebugLog.d("END " + endIndex);
                MyClickableSpan span = new MyClickableSpan();
                output.setSpan(span, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    }
}

但是日志是:

OPEN 0
OPEN 13
END 18
END 18

但是,在字符串之前插入一个字符后,输出就是我所期望的:

字符串:

"a<articlelink>text1</articlelink> padding<articlelink>text2</articlelink>"

输出:

OPEN 1
END 6
OPEN 14
END 19

这里发生了什么?这是一个错误还是我误用了它?

3 个答案:

答案 0 :(得分:9)

我通过添加到字符串“zero width joiner”的开头来解决这个问题

字符串看起来像:

"&zwj;<articlelink>text1</articlelink>padding<articlelink>text2</articlelink>"

在结果textview中,此符号不可见,文本看起来像原始字符串

答案 1 :(得分:1)

我在编写自定义TagHandler时也遇到过这个问题。在我看来,这似乎是一个Android错误。即使这个问题很老,因为那里没有关于这个问题的真正信息,我仍然会发布我的解决方案......它可能对某人有帮助。

当文本以HTML标记开头(在索引0处),回调到&#34; handleTag()&#34;时会出现有问题的情况。当处理到达文本末尾时,将触发关闭标志。

这个问题的解决方法是使用单独的标签来打开和关闭标记,例如:

"<start>text1<end> padding<start>text2<end>"

注意&#34;结束&#34;标签不是结束标签(它之前没有&#34; /&#34;)。

通过执行此操作,您需要使用以下常规形式更改handleTag()方法中的逻辑:

public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
    if (tag.equalsIgnoreCase("start")) {
        // Handle opening of your tag
    } else if (tag.equalsIgnoreCase("end")) {
        // Handle closing of your tag
    }
}

布尔&#34;开放&#34;不再需要参数,并且还会正确返回output.length(),因为问题只出现在你不会使用的结束标记上。

答案 2 :(得分:0)

同样也遇到了这个问题,看来可行的方法是将文本包装在<html>...</html>标记中。这样,html标签将是最后关闭的标签,其余随附的标签也可以正常工作。