¿Cómo establecer la posición del cursor en EditText?

235

Hay dos EditText, al cargar la página, se establece un texto en el primer EditText, por lo que ahora el cursor estará en el lugar de inicio EditText, quiero establecer la posición del cursor en el segundo EditText que no contiene datos. ¿Como hacer esto?

nila
fuente
2
puede establecer su gravedad en 'centro'. automáticamente configurará el cursor para que esté en el centro. su texto también estaría centrado entonces.
Hiral Vadodaria
En primer lugar, intente mejorar su índice de aceptación. segundo, ¿qué quieres decir con establecer la posición del cursor, cuando no hay texto en edittext?
Vladimir

Respuestas:

483

Donde position es un int:

editText1.setSelection(position)
NotACleverMan
fuente
¿Hay alguna manera de hacer esto en el archivo XML?
kike
@kike no lo creo
atasoyh
1
use android: selección en xml con enlace de datos
Mubarak Mohideen
96

He hecho esta manera de establecer la posición del cursor al final del texto después de actualizar el texto de EditText programáticamente aquí, etmsges EditText

etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);
MKJParekh
fuente
44
+1 ¡ah! Agradable me ayudó a establecer la posición del cursor en edittext.
Dharmendra
2
Esto no funcionó para mí. Tengo cadenas Spannable en mi EditText. ¿Hay alguna solución para eso?
toobsco42
1
@ toobsco42 Hola, acabo de intentar usar Spannable String en edittext ... compruebe esto pastebin.com/i02ZrNw4 y funciona como se espera como debería ... compruebe y compare
MKJParekh
¿Esto es posible desde el archivo xml? @MKJParekh
Yog Guru
1
Parece hacer lo mismo:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Steve Blackwell
37

Cómo establecer la posición del cursor EditText en Android

Debajo del código se establece el cursor para comenzar en EditText:

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);

Debajo del código se encuentra el cursor al final de EditText:

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());

Debajo del código se encuentra el cursor de configuración después de una segunda posición de carácter:

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(2);
IntelliJ Amiya
fuente
17

Quiero establecer la posición del cursor en edittext que no contiene datos

Solo hay una posición en un EditText vacío, es setSelection(0).

¿O quiso decir que desea enfocarse en su EditTextcuando se abre su actividad? En ese caso es requestFocus()

Reno
fuente
setSelection (0) no funciona, no quiero enfocarme en el segundo EditText, solo quiero establecer el cursor en el segundo EditText
nila
3
Si no recuerdo mal, cuando un EditText solicita el foco, se establece el cursor. Lea esto
Reno el
12

usa la línea de abajo

e2.setSelection(e2.length());

e2 es editar texto Nombre del objeto

Syed Danish Haider
fuente
9

Deje que editText2 sea su segunda vista EditText. Luego ponga el siguiente código en onResume ()

editText2.setFocusableInTouchMode(true);
editText2.requestFocus();

o poner

<requestFocus />

en su diseño xml de la segunda vista EditText.

Monish George
fuente
7

alguna vez el cursor de edición de texto no viene en una posición particular si lo usamos directamente editText.setSelection(position);. En ese caso puedes intentar

editText.post(new Runnable() {
                @Override
                public void run() {
                    editText.setSelection(string.length());
                }
            });
dev.sourabh
fuente
7

Si desea colocar el cursor en una determinada posición en un EditText, puede usar:

yourEditText.setSelection(position);

Además, existe la posibilidad de establecer la posición inicial y final, de modo que seleccione programáticamente algún texto de esta manera:

yourEditText.setSelection(startPosition, endPosition);

Tenga en cuenta que configurar la selección puede ser complicado ya que puede colocar el cursor antes o después de un carácter, la imagen a continuación explica cómo funciona el índice en este caso:

ingrese la descripción de la imagen aquí

Entonces, si desea el cursor al final del texto, simplemente configúrelo en yourEditText.length().

Junior Damacena
fuente
5

setSelection(int index)El método Edittextdebería permitirle hacer esto.

Avinash
fuente
4

como recordatorio: si está utilizando edittext.setSelection()para configurar el cursor, y NO funciona mientras configura, alertdialogpor ejemplo, asegúrese de configurar selection()DESPUÉS de que se haya creado el diálogo

ejemplo:

AlertDialog dialog = builder.show();
input.setSelection(x,y);
calav3ra
fuente
3

Este código lo ayudará a mostrar su cursor en la última posición de edición de texto.

 editText.requestFocus();
 editText.setSelection(editText.length());
Kailas Bhakade
fuente
2

Recuerde llamar requestFocus()antes setSelectionpara editar el texto.

Dong Thang
fuente
1

No obtendré el método setSelection () directamente, así que hice lo siguiente y trabajo como encanto

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setText("Updated New Text");
int position = editText.getText().length();
Editable editObj= editText.getText();
Selection.setSelection(editObj, position);
sujith m
fuente
1

Si desea establecer el cursor después del ncarácter de derecha a izquierda, debe hacer esto.

edittext.setSelection(edittext.length()-n);

Si editar texto del texto como

version<sub></sub>

y quieres mover el cursor en la sexta posición desde la derecha

Luego moverá el cursor a-

    version<sub> </sub>
                ^
Rasel
fuente
1
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
Satendra Behre
fuente
1
if(myEditText.isSelected){
    myEditText.setSelection(myEditText.length())
    }
MSilva
fuente
0

Establecer cursor en una fila y columna

Puede usar el siguiente código para obtener la posición en su EditText que corresponde a una determinada fila y columna. Luego puede usar editText.setSelection(getIndexFromPos(row, column))para establecer la posición del cursor. Se pueden realizar las siguientes llamadas al método:

  • getIndexFromPos(x, y) Ir a la columna y de la línea x
  • getIndexFromPos(x, -1) Ir a la última columna de la línea x
  • getIndexFromPos(-1, y) Ir a la columna y de la última línea.
  • getIndexFromPos(-1, -1) Ir a la última columna de la última línea.

Se manejan todos los límites de línea y columna; Ingresar una columna mayor que la longitud de la línea devolverá la posición en la última columna de la línea. Ingresar una línea mayor que el recuento de líneas de EditText irá a la última línea. Debe ser lo suficientemente confiable, ya que se probó en gran medida.

static final String LINE_SEPARATOR = System.getProperty("line.separator");

int getIndexFromPos(int line, int column) {
    int lineCount = getTrueLineCount();
    if (line < 0) line = getLayout().getLineForOffset(getSelectionStart());  // No line, take current line
    if (line >= lineCount) line = lineCount - 1;  // Line out of bounds, take last line

    String content = getText().toString() + LINE_SEPARATOR;
    int currentLine = 0;
    for (int i = 0; i < content.length(); i++) {
        if (currentLine == line) {
            int lineLength = content.substring(i, content.length()).indexOf(LINE_SEPARATOR);
            if (column < 0 || column > lineLength) return i + lineLength;  // No column or column out of bounds, take last column
            else return i + column;
        }
        if (String.valueOf(content.charAt(i)).equals(LINE_SEPARATOR)) currentLine++;
    }
    return -1;  // Should not happen
}

// Fast alternative to StringUtils.countMatches(getText().toString(), LINE_SEPARATOR) + 1
public int getTrueLineCount() {
    int count;
    String text = getText().toString();
    StringReader sr = new StringReader(text);
    LineNumberReader lnr = new LineNumberReader(sr);
    try {
        lnr.skip(Long.MAX_VALUE);
        count = lnr.getLineNumber() + 1;
    } catch (IOException e) {
        count = 0;  // Should not happen
    }
    sr.close();
    return count;
}

La pregunta ya fue respondida, pero pensé que alguien podría querer hacer eso en su lugar.

Funciona recorriendo cada carácter, incrementando el recuento de líneas cada vez que encuentra un separador de línea. Cuando el recuento de líneas es igual a la línea deseada, devuelve el índice actual + la columna, o el índice final de línea si la columna está fuera de los límites. También puede reutilizar el getTrueLineCount()método, devuelve un recuento de líneas ignorando el ajuste de texto, a diferencia TextView.getLineCount().

Nicolas
fuente
0

En kotlin, podría crear una función de extensión como esta:

fun EditText.placeCursorAtLast() {
    val string = this.text.toString()
    this.setSelection(string.length)
}

y luego simplemente llame myEditText.placeCursorAtLast()

notdrone
fuente
0

Si desea establecer la posición del cursor en EditText? prueba estos códigos a continuación

EditText rename;
 String title = "title_goes_here";
 int counts = (int) title.length();
 rename.setSelection(counts);
 rename.setText(title);
Mujahid Khan
fuente
0

Cómo resolver el problema de la posición del cursor que se mueve automáticamente a la última posición después de formatear en US Mobile como (xxx) xxx-xxxx en Android.

private String oldText = "";
private int lastCursor;
private EditText mEtPhone;

@Override
    public void afterTextChanged(Editable s) {
String cleanString = AppUtil.cleanPhone(s.toString());

String format = cleanString.length() < 11 ? cleanString.replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3") :
                cleanString.substring(0, 10).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3");


boolean isDeleted = format.length() < oldText.length();

        try {

            int cur = AppUtil.getPointer(lastCursor, isDeleted ? s.toString() : format, oldText, isDeleted);
            mEtPhone.setSelection(cur > 0 ? cur : format.length());

        }catch (Exception e){
            e.printStackTrace();
            mEtPhone.setSelection(format.length());
        }

        mEtPhone.addTextChangedListener(this);

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        oldText = s.toString();
        lastCursor = start;
    }

Definir el siguiente método para cualquier clase de actividad en mi caso El nombre de la actividad es AppUtil y acceder a él globalmente

public static int getPointer(int index, String newString, String oldText, boolean isDeleted){

        int diff = Math.abs(newString.length() - oldText.length());

        return diff > 1 ? isDeleted ? index - diff : index  + diff : isDeleted ? index : index + 1;
    }

public static String cleanPhone(String phone){

        if(TextUtils.isEmpty(phone))
            return "";

        StringBuilder sb = new StringBuilder();
        for(char c : phone.toCharArray()){
            if(Character.isDigit(c))
                sb.append(c);
        }
        return sb.toString();
    }

Y si quieres establecer una posición específica

edittext.setSelection(position);
Jai Prakash
fuente
-3

Creo que la forma más simple de hacer esto es simplemente usar relleno.

Digamos en la sección edittext de tu xml, agrega android: paddingLeft = "100dp" Esto moverá tu posición de inicio del cursor 100dp a la derecha desde el extremo izquierdo.

De la misma manera, puede usar android: paddingRight = "100dp" Esto moverá su posición final del cursor 100dp hacia la izquierda desde el extremo derecho.

Para obtener más detalles, consulte este artículo en mi blog : Android: Configuración de la posición inicial y final del cursor en el widget EditText

Arthur Wang
fuente
2
El relleno no tiene nada que ver con la posición del cursor, y es una escuela de pensamiento completamente equivocada en esta situación particular.
Tiburón