Estoy cambiando el valor de un EditText
enkeyListener
.
Pero cuando cambio el texto, el cursor se mueve al comienzo de EditText
. Necesito que el cursor esté al final del texto.
Cómo mover el cursor al final del texto en a EditText
.
Estoy cambiando el valor de un EditText
enkeyListener
.
Pero cuando cambio el texto, el cursor se mueve al comienzo de EditText
. Necesito que el cursor esté al final del texto.
Cómo mover el cursor al final del texto en a EditText
.
Prueba esto:
EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
onSelectionChanged()
método de una EditText
clase: public void onSelectionChanged(int start, int end) { CharSequence text = getText(); if (text != null) { if (start != text.length() || end != text.length()) { setSelection(text.length(), text.length()); return; } } super.onSelectionChanged(start, end); }
Hay una función llamada append para ediitext que agrega el valor de la cadena al valor actual de edittext y coloca el cursor al final del valor. Puede tener el valor de cadena como el valor actual de ediitext y llamar a append ();
myedittext.append("current_this_edittext_string");
myedittext.append("");
myedittext.append("");
no funcionó para mí!
Selection
es la forma correcta de lograr esa OMI.
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.text.length)
El siguiente código es colocar 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());
El siguiente código es colocar el cursor después del segundo carácter:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
findViewById(R.id.edittext_id) as EditText
con findViewById<EditText>(R.id.edittext_id)
o simplemente evitar el vaciado si se utilizaAPI 26+
Si llamó setText
antes y el nuevo texto no obtuvo la fase de diseño, llame setSelection
a un ejecutable separado disparado por View.post(Runnable)
(reenvío de este tema).
Entonces, para mí, este código funciona:
editText.setText("text");
editText.post(new Runnable() {
@Override
public void run() {
editText.setSelection(editText.getText().length());
}
});
Editar 16/05/2019: En este momento estoy usando la extensión de Kotlin para eso:
fun EditText.placeCursorToEnd() {
this.setSelection(this.text.length)
}
y luego - editText.placeCursorToEnd ().
También puede colocar el cursor al final del texto en la EditText
vista de esta manera:
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;
}
});
Esta es otra posible solución:
et.append("");
Simplemente pruebe esta solución si no funciona por alguna razón:
et.setSelection(et.getText().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);
¡Funciona bien para mí!
En mi caso, creé el siguiente kotlin ext. función, puede ser útil para alguien
private fun EditText.focus(){
requestFocus()
setSelection(length())
}
Luego use de la siguiente manera
mEditText.focus()
Si su EditText no está claro:
editText.setText("");
editText.append("New text");
o
editText.setText(null);
editText.append("New text");
Creo que esto puede lograr lo que quieres.
Editable etext = mSubjectTextEditor.getText();
Selection.setSelection(etext, etext.length());
La pregunta es antigua y está respondida, pero creo que puede ser útil tener esta respuesta si desea utilizar las nuevas herramientas DataBinding para Android, solo configúrelo en su XML:
<data>
<variable name="stringValue" type="String"/>
</data>
...
<EditText
...
android:text="@={stringValue}"
android:selection="@{stringValue.length()}"
...
/>
Hola Intenta 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
Cursor
Si desea seleccionar todo el texto e ingresar texto nuevo en lugar del anterior, puede usar
android:selectAllOnFocus="true"
Esto funciona
Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());
editText.setSelection
Es la magia aquí. Básicamente, la selección le permite colocar el cursor en cualquier posición que desee.
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
Esto coloca el cursor al final de EditText. Básicamente editText.getText().length()
te da la longitud del texto. Luego lo usas setSelection
con longitud.
editText.setSelection(0);
Es para colocar el cursor en la posición inicial (0).
Todos los demás códigos que probé no funcionaron bien debido al hecho de que el usuario aún podía colocar el cursor / cursor en cualquier lugar en el medio de la cadena (ej .: 12 | 3.00 - donde | está el cursor). Mi solución siempre coloca el cursor al final de la cadena cada vez que se toca en EditText.
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!
Necesitaba esta funcionalidad EditText
con soporte multilínea en mi aplicación de notas. Quería el cursor al final del texto cuando el usuario navega hacia el fragmento que tiene texto de nota.
La solución sugerida por el djleop se acerca. Pero el problema con esto es que, si el usuario coloca el cursor en algún lugar en el medio del texto para editarlo y comienza a escribir, el cursor volvería al final del texto. Esto sucedió porque elLiveData
emitiría el nuevo valor y el cursor saltaría al final del texto nuevamente, lo que provocaría que el usuario no pudiera editar el texto en algún lugar en el medio.
Para resolver esto, lo uso MediatorLiveData
y le asigno la longitud de String
solo una vez usando una bandera. Esto hará que LiveData lea el valor solo una vez, es decir, cuando el usuario navegue hasta el fragmento. Después de eso, el usuario puede colocar el cursor en cualquier lugar donde desee editar el texto allí.
ViewModel
private var accessedPosition: Boolean = false
val cursorPosition = MediatorLiveData<Event<Int>>().apply {
addSource(yourObject) { value ->
if(!accessedPosition) {
setValue(Event(yourObject.note.length))
accessedPosition = true
}
}
}
Aquí, yourObject
hay otro LiveData recuperado de la base de datos que contiene el texto de cadena que está mostrando en elEditText
.
Luego vincule esto MediatorLiveData
a su EditText usando un adaptador de encuadernación.
XML
Utiliza el enlace de datos bidireccional para mostrar texto y aceptar la entrada de texto.
<!-- android:text must be placed before cursorPosition otherwise we'll get IndexOutOfBounds exception-->
<EditText
android:text="@={viewModel.noteText}"
cursorPosition="@{viewModel.cursorPosition}" />
Adaptador de enlace
@BindingAdapter("cursorPosition")
fun bindCursorPosition(editText: EditText, event: Event<Int>?) {
event?.getContentIfNotHandled()?.let { editText.setSelection(it) }
}
Event
clase
La Event
clase aquí es como un evento SingleLiveEvent escrito por José Alcérreca de Google. Lo uso aquí para encargarme de la rotación de la pantalla. El uso del sencillo Event
asegurará que el cursor no salte al final del texto cuando el usuario esté editando el texto en algún lugar en el medio y la pantalla gire. Mantendrá la misma posición cuando la pantalla gire.
Aquí está la Event
clase:
open class Event<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}
Esta es la solución que funciona para mí y proporciona una buena experiencia de usuario. Espero que ayude en sus proyectos también.
similar a la respuesta de @Anh Duy, pero no funcionó para mí. También necesitaba que el cursor se moviera al final solo cuando el usuario toca el texto de edición y aún así 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;
}
});
Esto hace el truco de manera segura :
editText.setText("");
if (!TextUtils.isEmpty(text)) {
editText.append(text);
}
etSSID.setSelection(etSSID.getText().length());
Las respuestas anteriores no funcionaron para mí. Entonces descubrí una nueva solución. Esto puede ser útil para alguien. He estado usando la última versión de Android Studio, es decir, 3.5 según la fecha actual. Tal vez esa podría ser la razón por la cual las respuestas anteriores no mostraron ningún efecto.
CÓDIGO:
EditText available_seats = findViewById(R.id.available_seats);
Selection.setSelection(available_seats.getText(),available_seats.getText().length());
Aquí, el primer argumento es el valor de texto Spannable con el que desea jugar, mientras que el segundo argumento es el valor del índice. Como queremos el cursor al final del texto, tomamos getText (). Length () que devuelve la longitud del texto
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) {
}
}
Utilice este CustomEditText en su archivo XML, esto funcionará. He probado esto y está funcionando para mí.
Si desea colocar el cursor al final del texto en la vista Editar texto
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);
EditText
s como elementos de aListView
. En cuanto a la experimentación, hice algunos cambios en elListView
código fuente en sí, que es una bestia bastante compleja, y probé en el emulador. Estaba relacionado con la gestión de control de foco realizada por el componente. Por supuesto, no es una solución que pueda dar para ayudar a nuestro amigo. :)OnFocusChanged
devolución de llamada. La solución es poner setSelection dentro de un ejecutable y ejecutarlo en el hilo principal. Consulte aquí stackoverflow.com/a/32156989/4514796