Placer le curseur à la fin du texte dans EditText
je change la valeur d'un EditText
sur keyListener
.
mais quand je change le texte le curseur se déplace au début du EditText
.
J'ai besoin de le curseur à la fin du texte.
comment déplacer le curseur à la fin du texte dans un EditText
.
21 réponses
essayez ceci:
EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
il y a une fonction appelée append for ediitext qui ajoute la valeur string à la valeur edittext courante et place le curseur à la fin de la valeur. Vous pouvez avoir la valeur de chaîne comme la valeur ediitext courante elle-même et appeler ajouter ();
myedittext.append("current_this_edittext_string");
Kotlin :
régler le curseur sur la position de départ 151980920":
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
placer le curseur sur le fin de L'EditText :
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.getText().length())
le code ci-dessous doit placer le curseur après le deuxième caractère:
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)
JAVA :
régler le curseur à la position de départ :
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(0);
placer le curseur sur le fin de L'EditText :
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
le code ci-dessous doit placer le curseur après le deuxième caractère:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
si vous avez appelé setText
avant et que le nouveau texte n'a pas reçu l'appel de phase de mise en page setSelection
dans un exécutable séparé lancé par View.post(Runnable)
(report from this topic).
donc, pour moi ce code fonctionne:
editText.setText("text");
editText.post(new Runnable() {
@Override
public void run() {
registerPhone.setSelection("text".length());
}
});
vous pouvez aussi placer le curseur à la fin du texte dans le EditText
voir comme ceci:
EditText et = (EditText)findViewById(R.id.textview);
int textLength = et.getText().length();
et.setSelection(textLength, textLength);
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
editText.setSelection(editText.getText().length());
return false;
}
});
c'est une autre solution possible:
et.append("");
il suffit d'essayer cette solution si elle ne fonctionne pas pour une raison quelconque:
et.setSelection(et.getText().length());
je pense que cela peut atteindre ce que vous voulez.
Editable etext = mSubjectTextEditor.getText();
Selection.setSelection(etext, etext.length());
/**
* 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);
ça marche bien pour moi!
si votre texte N'est pas clair:
editText.setText("");
editText.append("New text");
tous les autres codes que j'ai testés n'ont pas fonctionné correctement en raison du fait que l'utilisateur pouvait encore placer le curseur/caret n'importe où au milieu de la chaîne (ex.: 12/3.00 - où | est le curseur). Ma solution met toujours le curseur à la fin de la chaîne chaque fois que le contact se produit sur L'EditText.
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/montant="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) {
}
});
Hope il aide!
ça fonctionne
Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());
Bonjour Essayez Cette
<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 point
curseur
la question Est vieille et a répondu, mais je pense qu'il peut être utile d'avoir cette réponse si vous voulez utiliser les outils de DataBinding nouvellement publié pour Android, il suffit de définir ce dans votre XML:
<data>
<variable name="stringValue" type="String"/>
</data>
...
<EditText
...
android:text="@={stringValue}"
android:selection="@{stringValue.length()}"
...
/>
Cela fait l'affaire en toute sécurité :
editText.setText("");
if (!TextUtils.isEmpty(text)) {
editText.append(text);
}
si vous voulez Sélectionner tout le texte et juste entrer le nouveau texte au lieu de l'ancien, vous pouvez utiliser
android:selectAllOnFocus="true"
dans mon cas j'ai créé le suivant Kotlin ext. la fonction peut être utile à quelqu'un
private fun EditText.focus(){
requestFocus()
setSelection(length())
}
puis utiliser comme suit
mEditText.focus()
semblable à la réponse de @Anh Duy, mais ça n'a pas marché pour moi. j'ai aussi eu besoin du curseur pour se déplacer vers la fin seulement lorsque l'utilisateur tape le texte d'édition et encore pouvoir sélectionner la position du curseur après, 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;
}
});
editText.setSelection
est la magie ici. Fondamentalement la sélection vous donne le curseur place à n'importe quelle position que vous voulez.
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
cela place le curseur à la fin D'EditText. Fondamentalement editText.getText().length()
vous donne la longueur du texte. Ensuite, vous utilisez setSelection
avec la longueur.
editText.setSelection(0);
c'est pour mettre le curseur à la position de départ (0).
public class CustomEditText extends EditText {
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomEditText(Context context) {
super(context);
}
public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
this.setSelection(this.getText().length());
}
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
}
}
utilisateur ce texte personnalisé dans votre fichier XML, cela fonctionnera. J'ai testé ceci et cela fonctionne pour moi.