一个TextView中存在多个ClickSpan

3
我有一个构建可点击标签的函数,用于textview。它如下所示:
    private CharSequence tagsBuilder(String text, String token) {
    SpannableStringBuilder builtTags = new SpannableStringBuilder();
    int start = 0, end = 0;

    for(int i = 0; i < 5; i++) {
        start = 0;
        end = text.indexOf(token, 0);

        try {
            if(start < end) {
                SpannableStringBuilder ssb = new SpannableStringBuilder(text.substring(start, end));
                ssb.setSpan(new ClickableSpan() {
                    @Override
                    public void onClick(View v)
                    {

                        Log.i("DEBUGTAG", "Span clicked - " + ((TextView) v).getText());
                    }
                }, start, end, 0);

                builtTags.append(ssb);
                builtTags.append(" ");
                text = text.substring(end + 1);
            }
        } catch (IndexOutOfBoundsException e) {
            break;
        }
    }

    return builtTags;
}

我能看到一个包含5个可单独点击标签的textview。但问题是,当任何标签被点击时,输出的Log都是textview的整个文本。
我做错了什么?我该如何获取单击的各个标签的文本?
1个回答

4

您的日志行如下:

Log.i("DEBUGTAG", "Span clicked - " + ((TextView) v).getText());

这会记录下TextView的内容。因此,您将获得TextView的文本。如果您想在其中获取token,则必须将其复制。

以下是您可以尝试的内容:

private CharSequence tagsBuilder(String text, final String token) {
SpannableStringBuilder builtTags = new SpannableStringBuilder();
int start = 0, end = 0;

for(int i = 0; i < 5; i++) {
    start = 0;
    end = text.indexOf(token, 0);

    try {
        if(start < end) {
            SpannableStringBuilder ssb = new SpannableStringBuilder(text.substring(start, end));
            ssb.setSpan(new ClickableSpan() {
                private String mText = token;
                @Override
                public void onClick(View v)
                {

                    Log.i("DEBUGTAG", "Span clicked - " + mText);
                }
            }, start, end, 0);

            builtTags.append(ssb);
            builtTags.append(" ");
            text = text.substring(end + 1);
        }
    } catch (IndexOutOfBoundsException e) {
        break;
    }
}

return builtTags;
}

我的错,我应该适当地命名参数。参数中的令牌实际上是一个分隔符。目前,","被传递以将逗号分隔的字符串拆分为标记。 - GreenBee
啊,好的,我没有仔细阅读你的代码。那就用你想要的子字符串替换我的token使用。不过你的代码看起来有点问题,start始终为0... - kabuko
非常感谢您的帮助,kabuko。我没有深入思考您最初的建议,但现在我明白了。稍作修改后,它可以正常工作- 最终字符串mText = ssb.toString();这段代码还在不断完善中;我已经优化了它以删除不需要的变量。 - GreenBee

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