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);
            //...
        }
        //...
*/