2010-08-31 15 views
50

Quiero insertar una cadena constante en EditText presionando un botón. La cadena debe insertarse en la posición actual en EditText. Si uso EditText.append, el texto se inserta al final de EditText.Android: inserte texto en EditText en la posición actual

¿Cómo puedo hacer eso? No pude encontrar un método adecuado.

Respuesta

17

Pruebe usar EditText.getSelectionStart() para obtener la posición actual del cursor. Luego puede usar String.subString para obtener el texto antes y después del cursor e insertar su texto en el medio.

84

Cpt.Ohlund me dio la pista correcta. Lo resolví, ahora, en parte con el uso de EditText.getSelectionStart(), pero me di cuenta de que también puedes reemplazar el texto seleccionado con la misma expresión y no necesitas String.subString() para eso.

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

Esto funciona para ambos, insertando un texto en la posición actual y reemplazando cualquier texto seleccionado por el usuario. El Math.max() es necesario en la primera y segunda línea porque, si no hay selección o cursor en EditText, getSelectionStart() y getSelectionEnd() ambos devolverán -1. El Math.min() y el Math.max() en la tercera línea es necesario porque el usuario podría haber seleccionado el texto al revés y, por lo tanto, comenzar tendría un valor superior al final que no está permitido para Editable.replace().

+0

obras como el encanto –

58

Esto parece simple:

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

Sin embargo, la respuesta de Manuel podría ser mejor si se desea reemplazar cualquier texto seleccionado por el texto insertado.

+1

Esta es sin duda la mejor respuesta. Debe ser aceptado. No hay motivo para reinventar la rueda y mantiene el 'Editable' sin sobreescribirlo con una llamada' setText() 'que es crucial en la mayoría de las aplicaciones. Más limpio, más simple y menos obstructivo para otros elementos en 'EditText' –

+0

¿es esto más rápido que usar subcadena? – has19

+1

Si ya hay un rango de texto seleccionado, entonces simplemente insertarlo al principio de la selección probablemente no sea lo que espera el usuario. – Suragch

4

creo que esta función le ayudará para usted:

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

Increíble, intenté todas las demás soluciones donde ninguna funciona para Xamarin Android. En Java, la función Reemplazar tiene más parámetros que el de Xamarin. Esto es simplemente perfecto! – Pierre

Cuestiones relacionadas