Как установить позицию курсора в EditText?
Есть два EditText
, при загрузке страницы текст устанавливается в первом EditText, так что теперь курсор будет находиться в начальной позиции EditText
Я хочу установить позицию курсора во втором EditText, который не содержит данных. Как это сделать?
27 ответов
Я сделал этот способ, чтобы установить позицию курсора в конец текста после обновления текста EditText программно здесь, etmsg
это EditText
etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);
Как установить положение курсора EditText в Android
Внизу кода установлен курсор для запуска в 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 есть только одна позиция, это setSeletion(0)
,
Или вы имели в виду, что вы хотите сосредоточиться на EditText
когда ваша деятельность открывается? В этом случае его requestFocus()
Пусть editText2 - это ваше второе представление EditText. Затем поместите следующий фрагмент кода в onResume().
editText2.setFocusableInTouchMode(true);
editText2.requestFocus();
или положить
<requestFocus />
в вашем XML-макете второго представления EditText.
Используйте строку ниже
e2.setSelection(e2.length());
e2
редактировать текст Имя объекта
Если вы хотите поместить курсор в определенную позицию на EditText, вы можете использовать:
yourEditText.setSelection(position);
Кроме того, есть возможность установить начальную и конечную позицию, чтобы вы программным образом выбирали какой-то текст следующим образом:
yourEditText.setSelection(startPosition, endPosition);
Обратите внимание, что установка выделения может быть сложной, так как вы можете поместить курсор перед или после символа, изображение ниже объясняет, как индексирование работает в этом случае:
Итак, если вы хотите курсор в конце текста, просто установите его в yourEditText.length()
,
Некоторое время редактировать текстовый курсор донот приходит в определенную позицию, если мы напрямую используем editText.setSelection(position);
, В этом случае вы можете попробовать
editText.post(new Runnable() {
@Override
public void run() {
editText.setSelection(string.length());
}
});
setSelection(int index)
метод в Edittext
должен позволить вам сделать это.
Это переместит курсор в конец edittext
myEditText.setSelection(myEditText.getText().toString().length())
Этот код поможет вам показать курсор на последней позиции редактирования текста.
editText.requestFocus();
editText.setSelection(editText.length());
В качестве напоминания: если вы используете edittext.setSelection()
установить курсор, и он НЕ работает при настройке alertdialog
например, обязательно установите selection()
ПОСЛЕ диалога был создан
пример:
AlertDialog dialog = builder.show();
input.setSelection(x,y);
Запомнить звонок requestFocus()
до setSelection
для редактирования текста.
Вы можете использовать это так:
if (your_edittext.getText().length() > 0 ) {
your_edittext.setSelection(your_edittext.getText().length());
}
Можете ли вы добавить эту строку в свой EditText xml
android:gravity="right"
android:ellipsize="end"
android:paddingLeft="10dp"//you set this as you need
Но при написании любого текста вы должны установить paddingleft на ноль.
вы должны использовать это в addTextChangedListener
Я не получу метод 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);
if(myEditText.isSelected){
myEditText.setSelection(myEditText.length())
}
Если вы хотите установить курсор после n
персонаж справа налево, то вы должны сделать так.
edittext.setSelection(edittext.length()-n);
Если текст редактирования текста, как
version<sub></sub>
и вы хотите переместить курсор на 6-ю позицию справа
Затем он будет перемещать курсор на
version<sub> </sub>
^
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
Как решить проблему положения курсора, которая автоматически перемещается в последнюю позицию после форматирования в 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, которая соответствует определенной строке и столбцу. Вы можете использовать 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()
,
Простой способ получить позицию курсора с помощью Kotlin:
val edInput = findViewById<EditText>(R.id.editTextInput)
var cursorPosition:Int = edInput.selectionStart
В случае, если кто-то застрял с опусканием курсора на первую позицию каждый раз, когда в поле ввода добавляется новый символ... Вам следует сохранить выбор, прежде чем текст будет установлен в вашем поле ввода.
binding.editName.apply {
val currentSelection = if (isFocused) selectionEnd else 0
setText(item.name)
setSelection(currentSelection)
}
В kotlin вы можете создать функцию расширения, например:
fun EditText.placeCursorAtLast() {
val string = this.text.toString()
this.setSelection(string.length)
}
а потом просто позвонить myEditText.placeCursorAtLast()
Если вы хотите установить позицию курсора в EditText? попробуйте этот код ниже
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);
В XML-файле Android:paddingLeft:
<EditText
android:id="@+id/txt_amount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dp"/>
я надеюсь, что это поможет вам
Я так поздно отвечал на эту проблему, поэтому разобрался. Просто используйте,
android:gravity= "center_horizontal"
Я считаю, что самый простой способ сделать это - просто использовать отступы.
Скажем, в разделе edittext вашего xml добавьте android:paddingLeft="100dp". Это сместит вашу начальную позицию курсора на 100dp справа от левого конца.
Точно так же вы можете использовать android:paddingRight="100dp" Это переместит вашу конечную позицию курсора на 100dp влево от правого конца.
Подробнее об этом читайте в моем блоге: Android: установка начальной и конечной позиции курсора в виджете EditText