Establecer cursor en una fila y columna
Puede usar el siguiente código para obtener la posición en su EditText que corresponde a una determinada fila y columna. Luego puede usar editText.setSelection(getIndexFromPos(row, column))
para establecer la posición del cursor. Se pueden realizar las siguientes llamadas al método:
getIndexFromPos(x, y)
Ir a la columna y de la línea x
getIndexFromPos(x, -1)
Ir a la última columna de la línea x
getIndexFromPos(-1, y)
Ir a la columna y de la última línea.
getIndexFromPos(-1, -1)
Ir a la última columna de la última línea.
Se manejan todos los límites de línea y columna; Ingresar una columna mayor que la longitud de la línea devolverá la posición en la última columna de la línea. Ingresar una línea mayor que el recuento de líneas de EditText irá a la última línea. Debe ser lo suficientemente confiable, ya que se probó en gran medida.
static final String LINE_SEPARATOR = System.getProperty("line.separator");
int getIndexFromPos(int line, int column) {
int lineCount = getTrueLineCount();
if (line < 0) line = getLayout().getLineForOffset(getSelectionStart()); // No line, take current line
if (line >= lineCount) line = lineCount - 1; // Line out of bounds, take last line
String content = getText().toString() + LINE_SEPARATOR;
int currentLine = 0;
for (int i = 0; i < content.length(); i++) {
if (currentLine == line) {
int lineLength = content.substring(i, content.length()).indexOf(LINE_SEPARATOR);
if (column < 0 || column > lineLength) return i + lineLength; // No column or column out of bounds, take last column
else return i + column;
}
if (String.valueOf(content.charAt(i)).equals(LINE_SEPARATOR)) currentLine++;
}
return -1; // Should not happen
}
// Fast alternative to StringUtils.countMatches(getText().toString(), LINE_SEPARATOR) + 1
public int getTrueLineCount() {
int count;
String text = getText().toString();
StringReader sr = new StringReader(text);
LineNumberReader lnr = new LineNumberReader(sr);
try {
lnr.skip(Long.MAX_VALUE);
count = lnr.getLineNumber() + 1;
} catch (IOException e) {
count = 0; // Should not happen
}
sr.close();
return count;
}
La pregunta ya fue respondida, pero pensé que alguien podría querer hacer eso en su lugar.
Funciona recorriendo cada carácter, incrementando el recuento de líneas cada vez que encuentra un separador de línea. Cuando el recuento de líneas es igual a la línea deseada, devuelve el índice actual + la columna, o el índice final de línea si la columna está fuera de los límites. También puede reutilizar el getTrueLineCount()
método, devuelve un recuento de líneas ignorando el ajuste de texto, a diferencia TextView.getLineCount()
.