Setzen Sie den Cursor auf eine Zeile und eine Spalte
Mit dem folgenden Code können Sie die Position in Ihrem EditText ermitteln, die einer bestimmten Zeile und Spalte entspricht. Sie können dann editText.setSelection(getIndexFromPos(row, column))
die Cursorposition einstellen. Die Methode kann folgendermaßen aufgerufen werden:
getIndexFromPos(x, y)
Gehen Sie zur Spalte y der Zeile x
getIndexFromPos(x, -1)
Gehen Sie zur letzten Spalte der Zeile x
getIndexFromPos(-1, y)
Gehen Sie zur Spalte y der letzten Zeile
getIndexFromPos(-1, -1)
Gehen Sie zur letzten Spalte der letzten Zeile
Alle Zeilen- und Spaltengrenzen werden behandelt. Wenn Sie eine Spalte eingeben, die größer als die Zeilenlänge ist, wird die Position in der letzten Spalte der Zeile zurückgegeben. Wenn Sie eine Zeile eingeben, die größer als die Zeilenanzahl des EditText ist, wird die letzte Zeile angezeigt. Es sollte zuverlässig genug sein, da es stark getestet wurde.
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;
}
Die Frage wurde bereits beantwortet, aber ich dachte, jemand könnte das stattdessen tun wollen.
Dabei werden die einzelnen Zeichen durchlaufen und die Zeilenanzahl jedes Mal erhöht, wenn ein Zeilentrennzeichen gefunden wird. Wenn die Zeilenanzahl der gewünschten Zeile entspricht, wird der aktuelle Index + die Spalte oder der Zeilenendindex zurückgegeben, wenn die Spalte außerhalb der Grenzen liegt. Sie können die getTrueLineCount()
Methode auch wiederverwenden. Im Gegensatz dazu wird eine Zeilenanzahl zurückgegeben, bei der der Textumbruch ignoriert wird TextView.getLineCount()
.