Их два EditText
, при загрузке страницы текст устанавливается в первом EditText, поэтому теперь курсор будет на начальной позиции EditText
, я хочу установить позицию курсора во втором EditText, который не содержит данных. Как это сделать?
Их два EditText
, при загрузке страницы текст устанавливается в первом EditText, поэтому теперь курсор будет на начальной позиции EditText
, я хочу установить позицию курсора во втором EditText, который не содержит данных. Как это сделать?
Ответы:
Где позиция является int:
editText1.setSelection(position)
Я сделал этот способ, чтобы установить позицию курсора в конец текста после обновления текста EditText программно
здесь, etmsg
EditText
etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);
etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Внизу кода установлен курсор для запуска в EditText
:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(0);
Код ниже Установить курсор в конец из EditText
:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
Ниже кода установлен курсор после некоторой позиции 2-го символа:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
Я хочу установить позицию курсора в тексте редактирования, который не содержит данных
В пустом EditText есть только одна позиция setSelection(0)
.
Или вы имели в виду, что хотите сфокусироваться на своем, EditText
когда начинается ваша деятельность? В этом случае его requestFocus()
используйте строку ниже
e2.setSelection(e2.length());
e2
редактировать текст Имя объекта
Пусть editText2 - это ваше второе представление EditText. Затем поместите следующий фрагмент кода в onResume ().
editText2.setFocusableInTouchMode(true);
editText2.requestFocus();
или положить
<requestFocus />
в вашем XML-макете второго представления EditText.
Некоторое время редактирование текстового курсора не происходит в определенной позиции, если мы непосредственно используем editText.setSelection(position);
. В этом случае вы можете попробовать
editText.post(new Runnable() {
@Override
public void run() {
editText.setSelection(string.length());
}
});
Если вы хотите поместить курсор в определенную позицию на EditText, вы можете использовать:
yourEditText.setSelection(position);
Кроме того, есть возможность установить начальную и конечную позицию, чтобы вы программным образом выбирали какой-то текст следующим образом:
yourEditText.setSelection(startPosition, endPosition);
Обратите внимание, что установка выделения может быть сложной, так как вы можете поместить курсор перед или после символа, изображение ниже объясняет, как индексирование работает в этом случае:
Итак, если вы хотите, чтобы курсор находился в конце текста, просто установите его в yourEditText.length()
.
Этот код поможет вам показать курсор на последней позиции редактирования текста.
editText.requestFocus();
editText.setSelection(editText.length());
Не забудьте позвонить requestFocus()
раньше setSelection
для редактирования текста.
Я не получу метод setSelection () напрямую, поэтому я сделал, как показано ниже, и работал как шарм
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setText("Updated New Text");
int position = editText.getText().length();
Editable editObj= editText.getText();
Selection.setSelection(editObj, position);
Если вы хотите установить курсор после n
символа справа налево, вы должны сделать это следующим образом.
edittext.setSelection(edittext.length()-n);
Если текст редактирования текста, как
version<sub></sub>
и вы хотите переместить курсор на 6-ю позицию справа
Затем он будет перемещать курсор на
version<sub> </sub>
^
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
Вы можете использовать следующий код, чтобы получить позицию в вашем EditText, которая соответствует определенной строке и столбцу. Затем вы можете использовать editText.setSelection(getIndexFromPos(row, column))
для установки позиции курсора. Следующие вызовы метода могут быть сделаны:
getIndexFromPos(x, y)
Перейти к столбцу y строки xgetIndexFromPos(x, -1)
Перейти к последнему столбцу строки xgetIndexFromPos(-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()
.
Если вы хотите установить позицию курсора в EditText? попробуйте этот код ниже
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);
Как решить проблему с позицией курсора, которая автоматически перемещается на последнюю позицию после форматирования в US Mobile, например (xxx) xxx-xxxx в Android.
private String oldText = "";
private int lastCursor;
private EditText mEtPhone;
@Override
public void afterTextChanged(Editable s) {
String cleanString = AppUtil.cleanPhone(s.toString());
String format = cleanString.length() < 11 ? cleanString.replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3") :
cleanString.substring(0, 10).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3");
boolean isDeleted = format.length() < oldText.length();
try {
int cur = AppUtil.getPointer(lastCursor, isDeleted ? s.toString() : format, oldText, isDeleted);
mEtPhone.setSelection(cur > 0 ? cur : format.length());
}catch (Exception e){
e.printStackTrace();
mEtPhone.setSelection(format.length());
}
mEtPhone.addTextChangedListener(this);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
oldText = s.toString();
lastCursor = start;
}
Определите приведенный ниже метод для любого Activityclass в моем случае. Activity name называется AppUtil, и доступ к нему осуществляется глобально.
public static int getPointer(int index, String newString, String oldText, boolean isDeleted){
int diff = Math.abs(newString.length() - oldText.length());
return diff > 1 ? isDeleted ? index - diff : index + diff : isDeleted ? index : index + 1;
}
public static String cleanPhone(String phone){
if(TextUtils.isEmpty(phone))
return "";
StringBuilder sb = new StringBuilder();
for(char c : phone.toCharArray()){
if(Character.isDigit(c))
sb.append(c);
}
return sb.toString();
}
И если вы хотите установить какую-то конкретную позицию
edittext.setSelection(position);
Я считаю, что самый простой способ сделать это - просто использовать отступы.
Скажем, в разделе edittext вашего xml добавьте android: paddingLeft = "100dp". Это сместит вашу начальную позицию курсора на 100dp справа от левого конца.
Точно так же вы можете использовать android: paddingRight = "100dp" Это переместит вашу конечную позицию курсора на 100dp влево от правого конца.
Более подробную информацию можно найти в моем блоге : Android: установка начальной и конечной позиции курсора в виджете EditText