android - Coloque el cursor al final del texto en EditText
android-edittext keylistener (21)
Creo que esto puede lograr lo que quieres.
Editable etext = mSubjectTextEditor.getText();
Selection.setSelection(etext, etext.length());
Estoy cambiando el valor de un EditText
en keyListener
.
Pero cuando cambio el texto, el cursor se está moviendo hacia el principio de EditText
. Necesito que el cursor esté al final del texto.
Cómo mover el cursor al final del texto en un EditText
.
Debería poder lograrlo con el método setSelection () de EditText, vea here
En mi caso creé la siguiente extensión de kotlin. función, puede ser útil para alguien
private fun EditText.focus(){
requestFocus()
setSelection(length())
}
Luego use de la siguiente manera
mEditText.focus()
Esta es otra solución posible:
et.append("");
Solo prueba esta solución si no funciona por alguna razón:
et.setSelection(et.getText().length());
Esto funciona
Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());
Esto hace el truco de forma segura :
editText.setText("");
if (!TextUtils.isEmpty(text)) {
editText.append(text);
}
Hay una función llamada adjuntar para ediitext que agrega el valor de cadena al valor de edición actual y coloca el cursor al final del valor. Puede tener el valor de cadena como el propio valor ediitext actual y llamar a append ();
myedittext.append("current_this_edittext_string");
La pregunta es antigua y está respondida, pero creo que puede ser útil tener esta respuesta si desea utilizar las herramientas de DataBinding recién lanzadas para Android, simplemente configure esto en su XML:
<data>
<variable name="stringValue" type="String"/>
</data>
...
<EditText
...
android:text="@={stringValue}"
android:selection="@{stringValue.length()}"
...
/>
Prueba esto:
EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
Si desea seleccionar todo el texto e ingresar un texto nuevo en lugar de uno antiguo, puede usar
android:selectAllOnFocus="true"
Si llamó a setText
antes y el texto nuevo no obtuvo la fase de diseño, llame a setSelection
en un ejecutable separado View.post(Runnable)
por View.post(Runnable)
( View.post(Runnable)
publicar de this tema).
Entonces, para mi este código funciona:
editText.setText("text");
editText.post(new Runnable() {
@Override
public void run() {
registerPhone.setSelection("text".length());
}
});
Si su EditText no está claro:
editText.setText("");
editText.append("New text");
También puede colocar el cursor al final del texto en la vista EditText
esta manera:
EditText et = (EditText)findViewById(R.id.textview);
int textLength = et.getText().length();
et.setSelection(textLength, textLength);
Todos los otros códigos que he probado no funcionaron bien debido a que el usuario aún podría colocar el cursor / cursor en cualquier lugar en medio de la cadena (ej .: 12 | 3.00 - donde | es el cursor). Mi solución siempre coloca el cursor al final de la cadena cada vez que se produce un toque en el texto de edición.
La solución definitiva es:
// 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 / amount = "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) {
}
});
¡Espero eso ayude!
similar a la respuesta de @Anh Duy, pero no funcionó para mí. También necesitaba que el cursor se moviera hasta el final solo cuando el usuario toca el texto de edición y aún puede seleccionar la posición del cursor después, este es el único código que me ha funcionado.
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;
}
});
Hola prueba esto
<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
EditText editText = findViewById(R.id.editText); editText.setSelection(editText.getText().length()); // End point
Cursor de EditText editText = findViewById(R.id.editText); editText.setSelection(editText.getText().length()); // End point
editText.setSelection
es la magia aquí. Básicamente, la selección te da un cursor de posición en cualquier posición que desees.
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
Esto coloca el cursor al final de EditText. Básicamente editText.getText().length()
le da la longitud del texto. Luego usas setSelection
con longitud.
editText.setSelection(0);
Es para colocar el cursor en la posición inicial (0).
Kotlin :
coloque el cursor en la posición inicial :
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
coloque el cursor al final del EditText :
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.getText().length())
Debajo del código se coloca el cursor después del segundo carácter:
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)
JAVA :
coloque el cursor en la posición inicial :
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(0);
coloque el cursor al final del EditText :
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
Debajo del código se coloca el cursor después del segundo carácter:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
/**
* 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);
Funciona bien para mí!
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
editText.setSelection(editText.getText().length());
return false;
}
});
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) {
}
}
Use este CustomEditText en su archivo XML, esto funcionará. He probado esto y está funcionando para mí.