在我的android应用程序中处理文本视图链接单击

在我的android应用程序中处理文本视图链接单击

我目前正在TextView中呈现HTML输入,如下所示:

tv.setText(Html.fromHtml("<a href='test'>test</a>"));

所显示的HTML是通过外部资源提供给我的,所以我不能像我想的那样改变周围的事物,但是我当然可以对HTML做一些正则表达式的修改,比如将href值更改为其他的东西。

我想要的是能够直接从应用程序中处理链接,而不是让链接打开浏览器窗口。这完全可以实现吗?我猜有可能将href-值的协议设置为“myApp:/”,然后注册一些可以让我的应用程序处理该协议的内容。如果这确实是最好的方法,我想知道是如何做到的,但我希望有一种更简单的方法,即“当在这个文本视图中单击链接时,我想引发一个事件,该事件接收链接的href值作为输入参数”


蓝山帝景
浏览 590回答 3
3回答

慕标琳琳

如果文本视图中有多个链接。例如,TextView有“https://”和“tel no”,我们可以定制LinkMotion方法,并根据模式处理对单词的单击。附件是定制链接运动方法。public&nbsp;class&nbsp;CustomLinkMovementMethod&nbsp;extends&nbsp;LinkMovementMethod{private&nbsp;static&nbsp;Context&nbsp;movementContext; private&nbsp;static&nbsp;CustomLinkMovementMethod&nbsp;linkMovementMethod&nbsp;=&nbsp;new&nbsp;CustomLinkMovementMethod(); public&nbsp;boolean&nbsp;onTouchEvent(android.widget.TextView&nbsp;widget,&nbsp;android.text.Spannable&nbsp;buffer,&nbsp;android.view.MotionEvent&nbsp;event){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;action&nbsp;=&nbsp;event.getAction(); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(action&nbsp;==&nbsp;MotionEvent.ACTION_UP) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x&nbsp;=&nbsp;(int)&nbsp;event.getX(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y&nbsp;=&nbsp;(int)&nbsp;event.getY(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;-=&nbsp;widget.getTotalPaddingLeft(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;-=&nbsp;widget.getTotalPaddingTop(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;+=&nbsp;widget.getScrollX(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;+=&nbsp;widget.getScrollY(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Layout&nbsp;layout&nbsp;=&nbsp;widget.getLayout(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;line&nbsp;=&nbsp;layout.getLineForVertical(y); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;off&nbsp;=&nbsp;layout.getOffsetForHorizontal(line,&nbsp;x); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URLSpan[]&nbsp;link&nbsp;=&nbsp;buffer.getSpans(off,&nbsp;off,&nbsp;URLSpan.class); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(link.length&nbsp;!=&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;=&nbsp;link[0].getURL(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(url.startsWith("https")) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d("Link",&nbsp;url); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Toast.makeText(movementContext,&nbsp;"Link&nbsp;was&nbsp;clicked",&nbsp;Toast.LENGTH_LONG).show(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(url.startsWith("tel")) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d("Link",&nbsp;url); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Toast.makeText(movementContext,&nbsp;"Tel&nbsp;was&nbsp;clicked",&nbsp;Toast.LENGTH_LONG).show(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(url.startsWith("mailto")) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d("Link",&nbsp;url); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Toast.makeText(movementContext,&nbsp;"Mail&nbsp;link&nbsp;was&nbsp;clicked",&nbsp;Toast.LENGTH_LONG).show(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;super.onTouchEvent(widget,&nbsp;buffer,&nbsp;event);}public&nbsp;static&nbsp;android.text.method.MovementMethod&nbsp;getInstance(Context&nbsp;c){ &nbsp;&nbsp;&nbsp;&nbsp;movementContext&nbsp;=&nbsp;c; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;linkMovementMethod;}应该以下列方式从文本视图中调用这一点:textViewObject.setMovementMethod(CustomLinkMovementMethod.getInstance(context));
打开App,查看更多内容
随时随地看视频慕课网APP