web-dev-qa-db-fra.com

Android: insérer du texte dans EditText à la position actuelle

Je veux insérer une chaîne constante dans un EditText en appuyant sur un bouton. La chaîne doit être insérée à la position actuelle dans EditText. Si j'utilise EditText.append le texte est inséré à la fin du EditText.

Comment puis je faire ça? Je n'ai pas trouvé de méthode appropriée.

57
Manuel

Essayez d'utiliser EditText.getSelectionStart() pour obtenir la position actuelle du curseur. Ensuite, vous pouvez utiliser String.subString pour obtenir le texte avant et après le curseur et insérer votre texte au milieu.

19
Cpt.Ohlund

Le Cpt.Ohlund m'a donné le bon indice. Je l'ai résolu, maintenant, en partie en utilisant EditText.getSelectionStart(), mais j'ai réalisé que vous pouvez également remplacer le texte sélectionné par la même expression et vous n'avez pas besoin de String.subString() pour cela.

int start = Math.max(myEditText.getSelectionStart(), 0);
int end = Math.max(myEditText.getSelectionEnd(), 0);
myEditText.getText().replace(Math.min(start, end), Math.max(start, end),
        textToInsert, 0, textToInsert.length());

Cela fonctionne pour les deux, en insérant un texte à la position actuelle et en remplaçant le texte sélectionné par l'utilisateur. La Math.max() est nécessaire sur la première et la deuxième ligne car, s'il n'y a pas de sélection ou de curseur dans EditText, getSelectionStart() et getSelectionEnd() renverra tous deux -1. La Math.min() et Math.max() dans la troisième ligne est nécessaire car l'utilisateur aurait pu sélectionner le texte à l'envers et donc start aurait une valeur supérieure à end qui n'est pas autorisée pour Editable.replace().

90
Manuel

Cela semble plus simple:

yourEditText.getText().insert(yourEditText.getSelectionStart(), "fizzbuzz");

Cependant, la réponse de Manuel pourrait être meilleure si vous souhaitez remplacer un texte sélectionné par le texte inséré.

72
Oleg Vaskevich

Je pense que cette fonction vous aidera:

public void insertConstantStr(String insertStr) {
    String oriContent = editText.getText().toString();
    int index = editText.getSelectionStart() >= 0 ? editText.getSelectionStart() : 0;
    StringBuilder sBuilder = new StringBuilder(oriContent);
    sBuilder.insert(index, insertStr);
    editText.setText(sBuilder.toString());
    editText.setSelection(index + insertStr.length());
}
5
wangzhengyi