如何在TextView中创建多个可点击文本部分

29

我怎样能够在TextView中实现多个可点击的文本部分,每个可点击部分都有自己的动作。


1
您可以使用Linkify为默认操作(例如电话、电子邮件、网站等)添加超链接。 - wolverine
尝试使用不同的TextView。如果可能的话,这是一个简单的解决方法。 - Fahad Ishaque
使用可跨度字符串 - Raghunandan
1
最好使用https://github.com/ajaysahani/MultiActionTextView。 - Zar E Ahmer
3个回答

63

你可以使用android.text.style.ClickableSpan

    SpannableString ss = new SpannableString("Hello World");
    ClickableSpan span1 = new ClickableSpan() {
        @Override
        public void onClick(View textView) {
            // do some thing
        }
    };

    ClickableSpan span2 = new ClickableSpan() {
        @Override
        public void onClick(View textView) {
            // do another thing
        }
    };

    ss.setSpan(span1, 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    ss.setSpan(span2, 6, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

    textView.setText(ss);
    textView.setMovementMethod(LinkMovementMethod.getInstance());

哦,只需为在链接之间遍历设置一个移动方法。 - stinepike
2
返回翻译文本:sb.setSpan(new ForegroundColorSpan(Color.parseColor("#D7011D")), 73, 88, 0);(此为Java代码,用于设置字符串中指定位置的文本颜色) - Rishabh Srivastava
1
@RishabhSrivastava 如果你改变颜色,如何添加点击监听器? - portfoliobuilder
@RishabhSrivastava 现在可能已经太晚了,但是您可以在SpannableString中将多个span设置为相同的文本。ss.setSpan(new ClickableSpan(), 73, 88, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ss.setSpan(new ForegroundColorSpan(Color.parseColor("#D7011D")), 73, 88, 0); - Rohan Taneja
1
@RohanTaneja 是的,太晚了。只有两年:D - Rishabh Srivastava
显示剩余3条评论

4

我将主要文本和可点击单词存储在不同的资源中。

某些配置下,资源中不存在字符串。

    String[] links = new String[3];

    links[0] = cntx.getString(cntx.getResources().getIdentifier("footerLink1", "string", cntx.getPackageName()));
    links[1] = cntx.getString(cntx.getResources().getIdentifier("footerLink2", "string", cntx.getPackageName()));
    links[2] = cntx.getString(cntx.getResources().getIdentifier("footerLink3", "string", cntx.getPackageName()));
    String text = String.format(cntx.getString(cntx.getResources().getIdentifier("footerDisclaimer", "string", cntx.getPackageName())), links[0], links[1], links[2]);
    SpannableString ss = new SpannableString(text);
    setSpanOnLink(ss, links[0], new ClickableSpan() {
        @Override
        public void onClick(View textView) {
            Log.i("Disclaimer Footer", "1 click");
            //TODO run item 
        }
    });
    setSpanOnLink(ss, links[1], new ClickableSpan() {
        @Override
        public void onClick(View textView) {
            Log.i("Disclaimer Footer", "2 click");
            //TODO run item 
        }
    });
    setSpanOnLink(ss, links[2], new ClickableSpan() {
        @Override
        public void onClick(View textView) {
            Log.i("Disclaimer Footer", "3click");
            //TODO run item 
        }
    });

    TextView t1 = new TextView(cntx);
    t1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 8);
    t1.setText(ss);
    t1.setMovementMethod(LinkMovementMethod.getInstance());

private void setSpanOnLink(SpannableString ss, String link, ClickableSpan cs) {
        String text = ss.toString();
        int start = text.indexOf(link);
        int end = start + link.length();
        ss.setSpan(cs, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

-1
这对我有用:
在xml中:
    <TextView
        android:id="@+id/tv_by_continuing_str"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:textSize="15sp"
        tools:text="Test msg 1 2, 3"
        android:textColor="@color/translucent_less_white3"
        android:textColorLink="@color/white"
        android:gravity="center|bottom"
        android:layout_above="@+id/btn_privacy_continue" />

在 strings.xml 文件中

< string name="by_continuing_str2">< ! [ CDATA[By continuing to use this app, you agree to our <a href="https://go.test.com" style="color:gray"/> Privacy Statement </a> and <a href="https://go.test.com" style="color:gray"/>Services Agreement.]]>< / string>

在活动中:

TextView tv_by_continuing = (TextView) findViewById(R.id.tv_by_continuing);
tv_by_continuing.setText(Html.fromHtml(getString(R.string.by_continuing_str2)));
tv_by_continuing.setMovementMethod(LinkMovementMethod.getInstance());

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