Поместите курсор в конец текста в EditText - PullRequest
796 голосов
/ 02 июня 2011

Я изменяю значение EditText на keyListener.

Но когда я меняю текст, курсор перемещается в начало EditText. Мне нужно, чтобы курсор был в конце текста.

Как переместить курсор в конец текста в EditText.

Ответы [ 24 ]

9 голосов
/ 27 ноября 2012

Я думаю, что это может достичь того, что вы хотите.

 Editable etext = mSubjectTextEditor.getText();
 Selection.setSelection(etext, etext.length());
7 голосов
/ 28 мая 2016

Если ваш EditText не понятен:

editText.setText("");
editText.append("New text");
6 голосов
/ 10 августа 2018

Вопрос старый и на него дан ответ, но я думаю, что этот ответ может быть полезным, если вы хотите использовать недавно выпущенные инструменты DataBinding для Android, просто установите его в своем XML:

<data>
    <variable name="stringValue" type="String"/>
</data>
...
<EditText
        ...
        android:text="@={stringValue}"
        android:selection="@{stringValue.length()}"
        ...
/>
5 голосов
/ 15 мая 2018

enter image description here

Здравствуйте, попробуйте это

 <EditText
       android:id="@+id/edt_text"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="Hello World!"
       android:cursorVisible="true"/>

EditText editText = findViewById(R.id.editText); editText.setSelection(editText.getText().length()); // End point Курсор

4 голосов
/ 03 мая 2017

Это работает

Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());
4 голосов
/ 24 июня 2016

Если вы хотите выделить весь текст и просто ввести новый текст вместо старого, вы можете использовать

    android:selectAllOnFocus="true"
3 голосов
/ 03 декабря 2016

Все остальные коды, которые я тестировал, не работали хорошо из-за того, что пользователь все еще мог поместить курсор / курсор где угодно в середине строки (например: 12 | 3,00 - где | - курсор ). Мое решение всегда помещает курсор в конец строки всякий раз, когда происходит касание EditText.

Окончательное решение:

// For a EditText like:
<EditText
                android:id="@+id/EditTextAmount"
                android:layout_height="wrap_content"
                android:layout_width="fill_parent"
                android:hint="@string/amount"
                android:layout_weight="1"
                android:text="@string/zero_value"
                android:inputType="text|numberDecimal"
                android:maxLength="13"/>

@ строка / объем = "0,00" @ Строка / zero_value = "0,00"

// Create a Static boolean flag
private static boolean returnNext; 


// Set caret/cursor to the end on focus change
EditTextAmount.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View editText, boolean hasFocus) {
                if(hasFocus){
                    ((EditText) editText).setSelection(((EditText) editText).getText().length());
                }
            }
        });

// Create a touch listener and put caret to the end (no matter where the user touched in the middle of the string)
EditTextAmount.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View editText, MotionEvent event) {
                ((EditText) editText).onTouchEvent(event);
                ((EditText) editText).setSelection(((EditText) editText).getText().length());
                return true;
            }
        });


// Implement a Currency Mask with addTextChangedListener
EditTextAmount.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                String input = s.toString();
                String output = new String();
                String buffer = new String();
                String decimals = new String();
                String numbers = Integer.toString(Integer.parseInt(input.replaceAll("[^0-9]", "")));

                if(returnNext){
                    returnNext = false;
                    return;
                }

                returnNext = true;

                if (numbers.equals("0")){
                    output += "0.00";
                }
                else if (numbers.length() <= 2){
                    output += "0." + String.format("%02d", Integer.parseInt(numbers));
                }
                else if(numbers.length() >= 3){
                    decimals = numbers.substring(numbers.length() - 2);
                    int commaCounter = 0;
                    for(int i=numbers.length()-3; i>=0; i--){
                        if(commaCounter == 3){
                            buffer += ",";
                            commaCounter = 0;
                        }
                        buffer += numbers.charAt(i);
                        commaCounter++;
                    }
                    output = new StringBuilder(buffer).reverse().toString() + "." + decimals;
                }
                EditTextAmount.setText(output);
                EditTextAmount.setSelection(EditTextAmount.getText().length());
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                /*String input = s.toString();
                if(input.equals("0.0")){
                    EditTextAmount.setText("0.00");
                    EditTextAmount.setSelection(EditTextAmount.getText().length());
                    return;
                }*/
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

Надеюсь, это поможет!

3 голосов
/ 13 мая 2018

editText.setSelection это магия здесь.По сути, выбор дает вам поместить курсор в любую позицию, которую вы хотите.

EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());

Это помещает курсор в конец EditText.В основном editText.getText().length() дает вам длину текста.Затем вы используете setSelection с длиной.

editText.setSelection(0);

Это для установки курсора в начальную позицию (0).

2 голосов
/ 24 мая 2016

Это делает трюк безопасно :

    editText.setText("");
    if (!TextUtils.isEmpty(text)) {
        editText.append(text);
    }
1 голос
/ 01 октября 2015

похоже на ответ @Anh Duy, но у меня это не сработало.мне также нужно было, чтобы курсор двигался до конца только тогда, когда пользователь нажимает на текст редактирования и все еще может выбрать позицию курсора после этого, это единственный код, который работал для меня

boolean textFocus = false; //define somewhere globally in the class

//in onFinishInflate() or somewhere
editText.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        editText.onTouchEvent(event);

        if(!textFocus) {
            editText.setSelection(editText.getText().length());
            textFocus = true;
        }

        return true;
    }
});

editText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        textFocus = false;
    }
});
...