web-dev-qa-db-fra.com

Placez le curseur à la fin du texte dans EditText

Je change la valeur d'une EditText sur keyListener.

Mais lorsque je change de texte, le curseur se déplace au début de la EditText. J'ai besoin que le curseur se trouve à la fin du texte.

Comment déplacer le curseur à la fin du texte dans une EditText.

751
Manu

Essaye ça:

EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
1183
Marqs

Il existe une fonction appelée append pour ediitext qui ajoute la valeur de chaîne à la valeur actuelle d'edittext et place le curseur à la fin de la valeur . Vous pouvez définir la valeur de chaîne comme valeur actuelle d'editeite et appeler append ();

myedittext.append("current_this_edittext_string"); 
201
James

Kotlin :

placez le curseur sur la position de départ :

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)

positionnez le curseur sur la fin de de EditText :

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.getText().length())

Le code ci-dessous consiste à placer le curseur après le deuxième caractère:

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)

Java :

placez le curseur sur la position de départ :

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);

positionnez le curseur sur la fin de de EditText :

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

Le code ci-dessous consiste à placer le curseur après le deuxième caractère:

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
90
Mr.vicky

Si vous avez appelé setText auparavant et que le nouveau texte ne comporte pas de phase de mise en page, appelez setSelection dans un fichier exécutable séparé, déclenché par View.post(Runnable) (republié à partir de this topic).

Donc, pour moi, ce code fonctionne:

editText.setText("text");
editText.post(new Runnable() {
         @Override
         public void run() {
             registerPhone.setSelection("text".length());
         }
});
63
Anton Derevyanko

Vous pouvez également placer le curseur à la fin du texte dans la vue EditText comme ceci:

EditText et = (EditText)findViewById(R.id.textview);
int textLength = et.getText().length();
et.setSelection(textLength, textLength);
40
toobsco42
editText.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        editText.setSelection(editText.getText().length());
        return false;
    }
});
26
Mario

C'est une autre solution possible: 

et.append("");

Essayez cette solution si cela ne fonctionne pas pour une raison quelconque:

et.setSelection(et.getText().length());
19
Kreshnik

Dans mon cas, j'ai créé le kotlin ext suivant. fonction, peut être utile à quelqu'un

 private fun EditText.focus(){
        requestFocus()
        setSelection(length())
    }

Puis utilisez comme suit

mEditText.focus()
11
Igor Siqueira

Vous devriez pouvoir y parvenir avec la méthode setSelection () de EditText, voir ici

11
Maximus

je pense que cela peut réaliser ce que vous voulez.

 Editable etext = mSubjectTextEditor.getText();
 Selection.setSelection(etext, etext.length());
9
Li Che
/**
 * Set cursor to end of text in edittext when user clicks Next on Keyboard.
 */
View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View view, boolean b) {
        if (b) {
            ((EditText) view).setSelection(((EditText) view).getText().length());
        }
    }
};

mEditFirstName.setOnFocusChangeListener(onFocusChangeListener); 
mEditLastName.setOnFocusChangeListener(onFocusChangeListener);

Cela fonctionne bien pour moi!

9
Anh Duy

Si votre EditText n'est pas clair:

editText.setText("");
editText.append("New text");
7
Leo Droidcoder

La question est ancienne et a reçu une réponse, mais je pense qu'il peut être utile de disposer de cette réponse si vous souhaitez utiliser les nouveaux outils DataBinding pour Android, définissez-le simplement dans votre XML: 

<data>
    <variable name="stringValue" type="String"/>
</data>
...
<EditText
        ...
        Android:text="@={stringValue}"
        Android:selection="@{stringValue.length()}"
        ...
/>
6
djleop

 enter image description here

Bonjour essayer ceci 

 <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 pointcurseur

5
Rahul Patil

Tous les autres codes que j'ai testés ne fonctionnaient pas correctement car l'utilisateur pouvait toujours placer le curseur d'insertion/curseur n'importe où au milieu de la chaîne (ex: 12 | 3.00 - où | est le curseur). Ma solution place toujours le curseur à la fin de la chaîne chaque fois que le contact a lieu sur le texte d'édition.

La solution ultime est:

// 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"/>

@ string/amount = "0.00" @ string/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) {

            }
        });

J'espère que ça aide!

3
Daniel Almeida

Cela marche

Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());
3
Hardik Vasani

Si vous voulez sélectionner tout le texte et simplement entrer du nouveau texte au lieu de l'ancien, vous pouvez

    Android:selectAllOnFocus="true"
3
ar-g

Cela fait l'affaire en toute sécurité

    editText.setText("");
    if (!TextUtils.isEmpty(text)) {
        editText.append(text);
    }
2
Alécio Carvalho

similaire à la réponse de @Anh Duy, mais cela n'a pas fonctionné pour moi. J'avais également besoin du curseur pour aller à la fin seulement lorsque l'utilisateur tapait sur le texte d'édition et pouvait toujours sélectionner la position du curseur par la suite, c'est le seul code qui a fonctionné pour moi.

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;
    }
});
1
Fonix
etSSID.setSelection(etSSID.getText().length());
0
siby varghese

Si vous voulez placer le curseur à la fin du texte en mode EditText

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