首页 > 解决方案 > 如何设置动态变化的 TextView 的每个单词的点击?

问题描述

我制作了一个TextView使用setText来自服务器的应用程序。所以从服务器获取的字符串是由用户动态更改的。现在我想让所有单词都可以点击TextView

例如:

TextView return the text(string) is : cricket football hockey ...etc(whatever).

为此,我想让每个单词都可点击,将用户发送到其他用户活动,例如社交媒体中的 hashTag 时尚。

     SpannableStringBuilder builder = new SpannableStringBuilder();
                String[] words = tag.split(" ");
                for(final String word: words)
                {
                    builder.append(word).setSpan(new ClickableSpan()
                    {
                                @Override
                                public void onClick(@NonNull View view)
                                {
                                    Toast.makeText(ClickPostEdit.this, word, Toast.LENGTH_SHORT).show();
                                }

                                // optional - for styling the specific text
            /*@Override
            public void updateDrawState(@NonNull TextPaint textPaint) {
                textPaint.setColor(textPaint.linkColor);    // you can use custom color
                textPaint.setUnderlineText(false);    // this remove the underline
            }*/
            }, builder.length() - word.length(), word.length(), 1);

                }
                EditPostTag.setText(builder, TextView.BufferType.SPANNABLE);
                EditPostTag.setMovementMethod(LinkMovementMethod.getInstance());

标签: javaandroid

解决方案


将ClickableSpans附加到SpannbleStringBuilder

您可以遍历您的单词列表,将每个单词附加到构建器并将 ClickableSpan 附加到它:

SpannableStringBuilder builder = new SpannableStringBuilder();
for(String word: words) {
    builder
            .append(word)
            .setSpan(new ClickableSpan() {
                @Override
                public void onClick(@NonNull View view) {
                    // on click
                }

                // optional - for styling the specific text
                /*@Override
                public void updateDrawState(@NonNull TextPaint textPaint) {
                    textPaint.setColor(textPaint.linkColor);    // you can use custom color
                    textPaint.setUnderlineText(false);    // this remove the underline
                }*/
            }, builder.length() - word.length(), builder.length(), 0);

}

要将此 Spannable 设置为 TextView,请使用:

textView.setText(builder, TextView.BufferType.SPANNABLE);
textView.setMovementMethod(LinkMovementMethod.getInstance());

取自这篇文章。

希望我的回答对您有所帮助!

结果:
在每个单词后添加“,”

添加


推荐阅读