TextView中的可单击链接处理程序

时间:2017-10-23 15:01:45

标签: android android-layout kotlin textview

与此问题类似,我尝试在TextView中显示可点击链接:How do I make links in a TextView clickable?

但我并不想要链接打开网站。我想自己处理点击事件,比如说,启动一个活动。以下是我到目前为止的情况:

myTextView.movementMethod = object: LinkMovementMethod() {
    override fun onTouchEvent(widget: TextView?, buffer: Spannable?, event: MotionEvent?): Boolean {

        doTheThing()

        return super.onTouchEvent(widget, buffer, event)
    }
}

在我的TextView上:

android:text="Foo <a href="bar">Bar</a>"

正如所料,&#34; Bar&#34;用蓝色加下划线,但每当我点击整个TextView时onTouchEvent都会被触发,包括在Foo上。当我点击&#34; Bar&#34;我只想要它开火。因为那是什么强调的。另外,如果我在文本中有多个链接怎么办?我如何让每个人做出不同的回应?

1 个答案:

答案 0 :(得分:0)

将字符串拆分为部分:在链接文本之前,链接文本,在链接文本之后:

<string name="part_1">Here is a </string> <string name="link_text">link</string> <string name="part_2"> for you to tap</string>

然后使用SpannableStringBuilder来组合部件,当您添加链接文本时,在第1部分字符串末尾到结尾处的跨度上设置ClickableSpan,并使用适当的链接处理程序第1部分+链接字符串:

SpannableStringBuilder builder = new SpannableStringBuilder(getString(R.string.part_1)); int spanStart = builder.length(); builder.append(getString(R.string.link_text)); int spanEnd = builder.length(); builder.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { // Do my thang } }, spanStart, spanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); builder.append(getString(R.string.part_2)); textView.setText(builder); textView.setMovementMethod(LinkMovementMethod.getInstance());