在我的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 關注
- 614 瀏覽
添加回答
舉報
0/150
提交
取消