Как установить позицию курсора в EditText?

Есть два EditText, при загрузке страницы текст устанавливается в первом EditText, так что теперь курсор будет находиться в начальной позиции EditTextЯ хочу установить позицию курсора во втором EditText, который не содержит данных. Как это сделать?

27 ответов

Решение

Где позиция 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);

Как установить положение курсора 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 строки 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(),

Простой способ получить позицию курсора с помощью 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

Другие вопросы по тегам