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?

nila
la source
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:

483

Où position est un int:

editText1.setSelection(position)
NotACleverMan
la source
existe-t-il un moyen de le faire dans le fichier XML?
kike
@kike Je ne pense pas
atasoyh
1
utiliser android: sélection en xml avec liaison de données
Mubarak Mohideen
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);
MKJParekh
la source
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);
IntelliJ Amiya
la source
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()

Reno
la source
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

Syed Danish Haider
la source
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.

George monish
la source
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());
                }
            });
dev.sourabh
la source
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().

Junior Damacena
la source
5

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

Avinash
la source
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);
calav3ra
la source
3

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

 editText.requestFocus();
 editText.setSelection(editText.length());
Kailas Bhakade
la source
2

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

Dong Thang
la source
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);
sujith s
la source
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>
                ^
Rasel
la source
1
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
Satendra Behre
la source
1
if(myEditText.isSelected){
    myEditText.setSelection(myEditText.length())
    }
MSilva
la source
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().

Nicolas
la source
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()

notdrone
la source
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);
Mujahid Khan
la source
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);
Jai Prakash
la source
-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

Arthur Wang
la source
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