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


235

Є два EditText, під час завантаження сторінки текст встановлюється в першому EditText, Отже, курсор буде на початковому місці EditText, я хочу встановити позицію курсору у другому EditText, яка не містить даних. Як це зробити?


2
Ви можете встановити його гравітацію на "center". Це автоматично встановить курсор у центрі. ваш текст також тоді буде зосереджений.
Хірал Вадодарія

Перш за все, спробуйте покращити коефіцієнт прийняття. по-друге, що ви маєте на увазі під встановленням курсору, коли в редакційному тексті немає тексту?
Володимир

Відповіді:


483

Де позиція - це int:

editText1.setSelection(position)

чи це можливо зробити у файлі XML?
кіке

@kike Я не думаю, що так
atasoyh

1
використовувати android: виділення в xml із прив'язкою даних
Mubarak Mohideen

96

Я зробив цей спосіб, щоб встановити позицію курсору в кінці тексту після оновлення тексту EditText програмно тут, etmsgє EditText

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

4
+1 ах! Приємно, що мені допомогло встановити положення курсору в редакційному тексті.
Дхармендра

2
Це для мене не вийшло. У моєму редакторі редагування є рядкові обертові рядки Чи існує рішення для цього?
toobsco42

1
@ Toobsco42 Здрастуйте, я просто спробував використовувати Spannable рядок в 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
Якщо я добре пам’ятаю, коли редактор запитів редагує текстText, курсор встановлюється. Прочитайте це
Рено


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().


5

setSelection(int index)метод в Edittextповинен дозволити вам це зробити.


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;
    }

Визначте нижченаведений метод для будь-якого класу Activity у моєму випадку Назва діяльності - 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

Я вважаю, що найпростіший спосіб зробити це просто використовувати підкладки.

Скажіть у розділі редагування тексту XML, додайте андроїд: paddingLeft = "100dp" Це перемістить ваше початкове положення курсору на 100 дп направо від лівого кінця.

Так само ви можете використовувати android: paddingRight = "100dp" Це перемістить ваше кінцеве положення курсору на 100 дп ліворуч від правого кінця.

Щоб отримати детальнішу інформацію, перегляньте цю статтю в моєму блозі : Android: Налаштування курсору вихідної та кінцевої позиції у віджеті EditText


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