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


235

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


2
Вы можете установить его гравитацию на «center». Он автоматически установит курсор в центр. Ваш текст также будет в центре тогда.
Хирал Вадодария

Прежде всего, попробуйте улучшить ваш коэффициент приема. во-вторых, что вы подразумеваете под установкой позиции курсора, когда в тексте редактирования нет текста?
Владимир

Ответы:



96

Я сделал этот способ, чтобы установить позицию курсора в конец текста после обновления текста EditText программно здесь, etmsgEditText

etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);

4
+1 ах! Приятно, что это помогло мне установить позицию курсора в тексте редактирования.
Дхармендра

2
Это не сработало для меня. У меня есть строки Spannable в моем EditText. Есть ли обходной путь для этого?
toobsco42

1
@ toobsco42 Здравствуйте, я только что попытался использовать Spannable String в edittext .. проверьте этот pastebin.com/i02ZrNw4 и он работает как положено, как и должно быть .. проверьте и сравните
MKJParekh

Можно ли это сделать из XML-файла? @MKJParekh
Йог Гуру

1
Кажется, делает то же самое:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Стив Блэквелл

37

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

17

Я хочу установить позицию курсора в тексте редактирования, который не содержит данных

В пустом EditText есть только одна позиция setSelection(0).

Или вы имели в виду, что хотите сфокусироваться на своем, EditTextкогда начинается ваша деятельность? В этом случае его requestFocus()


setSelection (0) не работает, я не хочу фокусироваться на втором EditText, я только хочу установить курсор во втором EditText
nila

3
Если я правильно помню, когда EditText запрашивает фокус, курсор установлен. Прочитайте это
Рено


9

Пусть editText2 - это ваше второе представление EditText. Затем поместите следующий фрагмент кода в onResume ().

editText2.setFocusableInTouchMode(true);
editText2.requestFocus();

или положить

<requestFocus />

в вашем XML-макете второго представления EditText.


7

Некоторое время редактирование текстового курсора не происходит в определенной позиции, если мы непосредственно используем editText.setSelection(position);. В этом случае вы можете попробовать

editText.post(new Runnable() {
                @Override
                public void run() {
                    editText.setSelection(string.length());
                }
            });

7

Если вы хотите поместить курсор в определенную позицию на EditText, вы можете использовать:

yourEditText.setSelection(position);

Кроме того, есть возможность установить начальную и конечную позицию, чтобы вы программным образом выбирали какой-то текст следующим образом:

yourEditText.setSelection(startPosition, endPosition);

Обратите внимание, что установка выделения может быть сложной, так как вы можете поместить курсор перед или после символа, изображение ниже объясняет, как индексирование работает в этом случае:

введите описание изображения здесь

Итак, если вы хотите, чтобы курсор находился в конце текста, просто установите его в yourEditText.length().



4

как напоминание: если вы используете edittext.setSelection()для установки курсора, и он НЕ работает при настройке, alertdialogнапример, убедитесь, что после selection()ПОСЛЕ диалогового окна было создано

пример:

AlertDialog dialog = builder.show();
input.setSelection(x,y);

3

Этот код поможет вам показать курсор на последней позиции редактирования текста.

 editText.requestFocus();
 editText.setSelection(editText.length());


1

Я не получу метод 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);

1

Если вы хотите установить курсор после nсимвола справа налево, вы должны сделать это следующим образом.

edittext.setSelection(edittext.length()-n);

Если текст редактирования текста, как

version<sub></sub>

и вы хотите переместить курсор на 6-ю позицию справа

Затем он будет перемещать курсор на

    version<sub> </sub>
                ^



0

Установить курсор на строку и столбец

Вы можете использовать следующий код, чтобы получить позицию в вашем 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().


0

В kotlin вы можете создать функцию расширения, например:

fun EditText.placeCursorAtLast() {
    val string = this.text.toString()
    this.setSelection(string.length)
}

а потом просто позвони myEditText.placeCursorAtLast()


0

Если вы хотите установить позицию курсора в EditText? попробуйте этот код ниже

EditText rename;
 String title = "title_goes_here";
 int counts = (int) title.length();
 rename.setSelection(counts);
 rename.setText(title);

0

Как решить проблему с позицией курсора, которая автоматически перемещается на последнюю позицию после форматирования в 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);

-3

Я считаю, что самый простой способ сделать это - просто использовать отступы.

Скажем, в разделе edittext вашего xml добавьте android: paddingLeft = "100dp". Это сместит вашу начальную позицию курсора на 100dp справа от левого конца.

Точно так же вы можете использовать android: paddingRight = "100dp" Это переместит вашу конечную позицию курсора на 100dp влево от правого конца.

Более подробную информацию можно найти в моем блоге : Android: установка начальной и конечной позиции курсора в виджете EditText


2
Заполнение не имеет ничего общего с положением курсора и является совершенно неправильной школой мысли в данной конкретной ситуации.
Акула
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.