在我的android应用程序中处理文本视图链接单击我目前正在TextView中呈现HTML输入,如下所示:tv.setText(Html.fromHtml("<a href='test'>test</a>"));所显示的HTML是通过外部资源提供给我的,所以我不能像我想的那样改变周围的事物,但是我当然可以对HTML做一些正则表达式的修改,比如将href值更改为其他的东西。我想要的是能够直接从应用程序中处理链接,而不是让链接打开浏览器窗口。这完全可以实现吗?我猜有可能将href-值的协议设置为“myApp:/”,然后注册一些可以让我的应用程序处理该协议的内容。如果这确实是最好的方法,我想知道是如何做到的,但我希望有一种更简单的方法,即“当在这个文本视图中单击链接时,我想引发一个事件,该事件接收链接的href值作为输入参数”
3 回答
慕标琳琳
TA贡献1830条经验 获得超9个赞
public class CustomLinkMovementMethod extends LinkMovementMethod{private static Context movementContext; private static CustomLinkMovementMethod linkMovementMethod = new CustomLinkMovementMethod(); public boolean onTouchEvent(android.widget.TextView widget, android.text.Spannable buffer, android.view.MotionEvent event){ int action = event.getAction(); if (action == MotionEvent.ACTION_UP) { int x = (int) event.getX(); int y = (int) event.getY(); x -= widget.getTotalPaddingLeft(); y -= widget.getTotalPaddingTop(); x += widget.getScrollX(); y += widget.getScrollY(); Layout layout = widget.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); URLSpan[] link = buffer.getSpans(off, off, URLSpan.class); if (link.length != 0) { String url = link[0].getURL(); if (url.startsWith("https")) { Log.d("Link", url); Toast.makeText(movementContext, "Link was clicked", Toast.LENGTH_LONG).show(); } else if (url.startsWith("tel")) { Log.d("Link", url); Toast.makeText(movementContext, "Tel was clicked", Toast.LENGTH_LONG).show(); } else if (url.startsWith("mailto")) { Log.d("Link", url); Toast.makeText(movementContext, "Mail link was clicked", Toast.LENGTH_LONG).show(); } return true; } } return super.onTouchEvent(widget, buffer, event);}public static android.text.method.MovementMethod getInstance(Context c){ movementContext = c; return linkMovementMethod;}
textViewObject.setMovementMethod(CustomLinkMovementMethod.getInstance(context));
- 3 回答
- 0 关注
- 585 浏览
添加回答
举报
0/150
提交
取消