67 votes

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 l'EditText. Si j'utilise EditText.append le texte est inséré à la fin de l'EditText.

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

105voto

Manuel Points 2525

Le Cpt. Ohlund m'a donné le bon indice. Je l'ai résolu, maintenant, en partie avec l'utilisation de EditText.getSelectionStart() mais j'ai réalisé que l'on peut aussi remplacer le texte sélectionné par la même expression et que l'on n'a pas besoin de String.subString() pour ça.

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 dans les deux cas, en insérant un texte à la position actuelle et en remplaçant le texte sélectionné par l'utilisateur. Le site Math.max() est nécessaire dans la première et la deuxième ligne car, s'il n'y a pas de sélection ou de curseur dans l'EditText, getSelectionStart() y getSelectionEnd() retourneront tous deux -1. Le site Math.min() y Math.max() dans la troisième ligne est nécessaire parce que l'utilisateur aurait pu sélectionner le texte à l'envers et donc le début aurait une valeur plus élevée que la fin, ce qui n'est pas autorisé pour le format Editable.replace() .

2 votes

La documentation précise que vous ne devez pas modifier le contenu de l'objet renvoyé par EditText.getText(). [developer.Android.com/reference/Android/widget/](https://developer.android.com/reference/android/widget/EditText.html#getText())

98voto

Oleg Vaskevich Points 4216

Cela semble plus simple :

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

Cependant, la réponse de Manuel est peut-être meilleure si vous voulez remplacer tout texte sélectionné par le texte inséré.

5 votes

C'est sans aucun doute la meilleure réponse. Elle devrait être acceptée. Il n'y a pas de raison de réinventer la roue et cela maintient l'intégrité du système. Editable sans l'écraser avec un setText() qui est crucial dans la plupart des applications. Le plus propre, le plus simple et le moins obstruant pour les autres éléments de la EditText

0 votes

Est-ce plus rapide que d'utiliser la sous-chaîne ?

1 votes

Si une plage de texte est déjà sélectionnée, l'insertion au début de la sélection n'est probablement pas ce que l'utilisateur attend.

23voto

Cpt.Ohlund Points 1127

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

6voto

Ghayas Ahmad Points 34

Pour Kotlin font simplement cela :

editText.text.insert(editText.selectionStart, "Your Text Here")

5voto

wangzhengyi Points 41

Je pense que cette fonction vous sera utile :

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

0 votes

Incroyable, j'ai essayé toutes les autres solutions mais aucune ne fonctionne pour Xamarin Android. En Java, la fonction Replace a plus de paramètres que celle de Xamarin. C'est tout simplement parfait !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X