Comment définir la position du curseur dans EditText?


235

Il y a deux EditText, lors du chargement de la page un texte est défini dans la première EditText, maintenant le curseur sera dans le lieu de départ de EditText, je veux ensemble la position du curseur dans la seconde EditText qui ne contient aucune donnée. Comment faire ça?


2
vous pouvez régler sa gravité sur `` centre '', il positionnera automatiquement le curseur au centre. votre texte serait alors également centré.
Hiral Vadodaria

tout d'abord, essayez d'améliorer votre taux d'acceptation. deuxièmement, que voulez-vous dire en définissant la position du curseur, lorsqu'il n'y a pas de texte dans edittext?
Vladimir

Réponses:



96

J'ai fait de cette façon pour définir la position du curseur à la fin du texte après avoir mis à jour le texte de EditText par programme ici, etmsgest EditText

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

4
+1 ah! Bien, cela m'a aidé à définir la position du curseur dans edittext.
Dharmendra

2
Cela n'a pas fonctionné pour moi. J'ai des chaînes pouvant être étendues dans mon EditText. Y a-t-il une solution pour cela?
toobsco42

1
@ toobsco42 Bonjour, je viens d'essayer d'utiliser la chaîne extensible dans edittext .. vérifiez ce pastebin.com/i02ZrNw4 et cela fonctionne comme prévu comme il se doit .. vérifiez et comparez
MKJParekh

Est-ce possible à partir du fichier xml? @MKJParekh
Yog Guru

1
Semble faire la même chose:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Steve Blackwell

37

Comment définir la position du curseur EditText dans Android

Sous le code est placé le curseur sur Commencer dans EditText:

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

Sous le code, placez le curseur à la fin de EditText:

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

Sous le code est placé le curseur après la position du 2ème caractère:

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

17

Je veux définir la position du curseur dans edittext qui ne contient aucune donnée

Il n'y a qu'une seule position dans un EditText vide, c'est setSelection(0).

Ou vouliez-vous dire que vous souhaitez vous concentrer sur votre EditTextlorsque votre activité ouvre? Dans ce cas, son requestFocus()


setSelection (0) ne fonctionne pas, je ne veux pas me concentrer sur le deuxième EditText, je veux seulement placer le curseur dans le deuxième EditText
nila

3
Si je me souviens bien, lorsqu'un EditText demande le focus, le curseur est réglé. Lisez ceci
Reno

12

utilisez la ligne ci-dessous

e2.setSelection(e2.length());

e2 est éditer le texte Nom de l'objet


9

Laissez editText2 est votre deuxième vue EditText. Puis mettez le morceau de code suivant dans onResume ()

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

ou mettre

<requestFocus />

dans votre disposition xml de la deuxième vue EditText.


7

un certain temps, le curseur de texte d'édition ne se trouve pas à une position particulière, si nous utilisons directement editText.setSelection(position);. Dans ce cas, vous pouvez essayer

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

7

Si vous souhaitez placer le curseur dans une certaine position sur un EditText, vous pouvez utiliser:

yourEditText.setSelection(position);

En outre, il est possible de définir la position initiale et finale, de sorte que vous sélectionniez par programme du texte, de cette façon:

yourEditText.setSelection(startPosition, endPosition);

Veuillez noter que la définition de la sélection peut être délicate car vous pouvez placer le curseur avant ou après un caractère, l'image ci-dessous explique comment indexer fonctionne dans ce cas:

entrez la description de l'image ici

Donc, si vous voulez que le curseur se trouve à la fin du texte, réglez-le simplement sur yourEditText.length().


5

setSelection(int index)La méthode in Edittextdevrait vous permettre de le faire.


4

pour rappel: si vous utilisez edittext.setSelection()pour régler le curseur, et que cela ne fonctionne PAS lors de la configuration d'un alertdialogpar exemple, assurez-vous de régler selection()APRÈS que la boîte de dialogue a été créée

exemple:

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

3

Ce code vous aidera à afficher votre curseur à la dernière position de modification du texte.

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

2

N'oubliez pas d'appeler requestFocus()avant setSelectionpour edittext.


1

Je n'obtiendrai pas directement la méthode setSelection (), donc j'ai fait comme ci-dessous et je travaille comme un charme

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

Si vous souhaitez placer le curseur après le ncaractère de droite à gauche, vous devez faire comme ceci.

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

Si le texte d'edittext comme

version<sub></sub>

et vous voulez déplacer le curseur à la 6ème position de la droite

Ensuite, il déplacera le curseur

    version<sub> </sub>
                ^

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

1
if(myEditText.isSelected){
    myEditText.setSelection(myEditText.length())
    }

0

Placer le curseur sur une ligne et une colonne

Vous pouvez utiliser le code suivant pour obtenir la position dans votre EditText qui correspond à une certaine ligne et colonne. Vous pouvez ensuite utiliser editText.setSelection(getIndexFromPos(row, column))pour définir la position du curseur. Les appels suivants à la méthode peuvent être effectués:

  • getIndexFromPos(x, y) Allez à la colonne y de la ligne x
  • getIndexFromPos(x, -1) Aller à la dernière colonne de la ligne x
  • getIndexFromPos(-1, y) Aller à la colonne y de la dernière ligne
  • getIndexFromPos(-1, -1) Aller à la dernière colonne de la dernière ligne

Toutes les limites de ligne et de colonne sont gérées; La saisie d'une colonne supérieure à la longueur de la ligne renverra la position dans la dernière colonne de la ligne. La saisie d'une ligne supérieure au nombre de lignes de EditText ira à la dernière ligne. Il devrait être suffisamment fiable car il a été fortement testé.

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

La question a déjà été répondue, mais je pensais que quelqu'un pourrait vouloir le faire à la place.

Il fonctionne en parcourant chaque caractère, en incrémentant le nombre de lignes chaque fois qu'il trouve un séparateur de ligne. Lorsque le nombre de lignes est égal à la ligne souhaitée, il renvoie l'index en cours + la colonne, ou l'index de fin de ligne si la colonne est hors limites. Vous pouvez également réutiliser la getTrueLineCount()méthode, elle retourne un nombre de lignes ignorant l'habillage du texte, contrairement à TextView.getLineCount().


0

Dans kotlin, vous pouvez créer une fonction d'extension comme celle-ci:

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

puis appelez simplement myEditText.placeCursorAtLast()


0

Si vous souhaitez définir la position du curseur dans EditText? essayez ces ci-dessous le code

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

0

Comment résoudre le problème de position du curseur qui se déplace automatiquement vers la dernière position après le formatage dans US Mobile comme (xxx) xxx-xxxx dans 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;
    }

Définissez la méthode ci-dessous pour n'importe quelle classe d'activité dans mon cas Le nom de l'activité est AppUtil et accédez-y globalement

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

Et si vous souhaitez définir une position spécifique

edittext.setSelection(position);

-3

Je crois que la façon la plus simple de le faire est simplement d'utiliser un rembourrage.

Dites dans la section edittext de votre xml, ajoutez android: paddingLeft = "100dp" Cela déplacera votre position de départ du curseur 100dp de droite à gauche.

De la même manière, vous pouvez utiliser android: paddingRight = "100dp" Cela déplacera votre position finale du curseur 100dp de gauche à droite.

Pour plus de détails, consultez cet article sur mon blog : Android: définition de la position de départ et de fin du curseur dans le widget EditText


2
Le remplissage n'a rien à voir avec la position du curseur et est une école de pensée complètement erronée dans cette situation particulière.
Shark
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.