private T FindSpan<T>(TextView textView, ISpannable spannable, MotionEvent e) where T : Java.Lang.Object { var x = (int)e.GetX() - textView.TotalPaddingLeft + textView.ScrollX; var y = (int)e.GetY() - textView.TotalPaddingTop + textView.ScrollY; var layout = textView.Layout; int position = layout.GetOffsetForHorizontal(layout.GetLineForVertical(y), x); var links = spannable.GetSpans(position, position, Java.Lang.Class.FromType(typeof(T))); if (links.Length > 0 && IsPositionWithinTag(position, spannable, links[0])) { return links[0] as T; } return default; } private bool IsPositionWithinTag(int position, ISpannable spannable, Java.Lang.Object tag) { return position >= spannable.GetSpanStart(tag) && position <= spannable.GetSpanEnd(tag); } /* USING: //... public override bool OnTouchEvent(TextView textView, ISpannable spannable, MotionEvent e) { //... var clickableSpan = FindSpan<ClickableSpan>(textView, spannable, e); //... } //... */