Установить курсор на строку и столбец
Вы можете использовать следующий код, чтобы получить позицию в вашем EditText, которая соответствует определенной строке и столбцу. Затем вы можете использовать editText.setSelection(getIndexFromPos(row, column))
для установки позиции курсора.
Следующие вызовы метода могут быть сделаны:
getIndexFromPos(x, y)
Перейти к столбцу y строки x
getIndexFromPos(x, -1)
Перейти к последнему столбцу строки x
getIndexFromPos(-1, y)
Перейти к столбцу y последней строки
getIndexFromPos(-1, -1)
Перейти к последнему столбцу последней строки
Все границы строк и столбцов обрабатываются; Ввод столбца, превышающего длину строки, вернет позицию в последнем столбце строки. Ввод строки, превышающей счетчик строк EditText, перейдет к последней строке. Он должен быть достаточно надежным, поскольку он был тщательно протестирован.
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;
}
На вопрос уже был дан ответ, но я подумал, что кто-то может захотеть сделать это вместо этого.
Он работает, проходя по каждому символу, увеличивая счетчик строк каждый раз, когда находит разделитель строк. Когда количество строк равно требуемой строке, оно возвращает текущий индекс + столбец или индекс конца строки, если столбец выходит за границы. Вы также можете повторно использовать метод getTrueLineCount()
, он возвращает количество строк, игнорируя перенос текста, в отличие от TextView.getLineCount()
.