Find exact coordinates of a single Character inside a TextView

Java Solution

Here is the full code for how to get the x and y coordinates of a specific character. offset is the index of the desired character in the textView's text. These coordinates are relative to the parent container

Layout layout = textView.getLayout();
if (layout == null) { // Layout may be null right after change to the text view
    // Do nothing
}

int lineOfText = layout.getLineForOffset(offset);
int xCoordinate = (int) layout.getPrimaryHorizontal(offset);
int yCoordinate = layout.getLineTop(lineOfText);

Kotlin Extension Function

If you expect to use this more than once:

fun TextView.charLocation(offset: Int): Point? {
    layout ?: return null // Layout may be null right after change to the text view

    val lineOfText = layout.getLineForOffset(offset)
    val xCoordinate = layout.getPrimaryHorizontal(offset).toInt()
    val yCoordinate = layout.getLineTop(lineOfText)
    return Point(xCoordinate, yCoordinate) 
}

NOTE: To ensure layout is not null, you can call textview.post(() -> { /* get coordinates */ }) in Java or textview.post { /* get coordinates */ } in Kotlin


Well it seems sort of a bug of Paint.measureText() or other deeper class. But I have FINALLY found a way around it:

layout.getPrimaryHorizontal(int offset)

This is very easy. You just iterate through the layout using the length of the text it uses.

It will return the the x of the Character REGARDLESS of line position. So lines I'm still getting from the layout.getLineTop(). By the way, if you are using the layout.getLineTop(), note that there is some strange behaviour, possibly a bug. I have submitted a bug report here.