2011-01-24 5 views
9

Por ejemplo, envíe una tecla de retroceso al control de edición de texto para eliminar un carácter o envíe un código como 112 para agregar un carácter en el control de texto de edición mediante programación.Cómo enviar eventos clave a un texto de edición

En realidad, necesito un método como

void onKeyReceived(int keyCode) 
{ 
    // here I would like to append the keyCode to EditText, I know how to add a visible character, but what about some special keys, like arrow key, backspace key. 
} 

Respuesta

1

Compruebe si hay eventos clave en su actividad. por ejemplo, este código a la escucha de back pulsación de tecla:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    { 
    finish(); 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

no lo quería, tengo que establecer una clave programáticamente – virsir

1

tratar la implementación de la interfaz TextWatcher.

tiene 3 métodos que debe anular.

public void afterTextChanged(Editable s) { 

    Log.v("afterTextChanged","here"); 
} 
public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

    Log.v("beforeTextChanged","here"); 
} 

public void onTextChanged(CharSequence s, int start, int before, int count) { 
} 

Creo que esto va a funcionar.

+0

No quiero monitorear el cambio del texto de edición, pero quiero configurar algo en el control de edición especialmente para alguna tecla especial como 'retroceso' – virsir

1

simplemente use el método setText para hacer esto. Si quieres simular un retroceso, podrías hacer algo como esto.

String curText = mEditText.getText(); 
if(!curText.equals("")){ 
    mEditText.setText(curText.subString(0, curText.length - 1)); 
} 
1

si quieres un oyente clic, la mejor manera de hacerlo es la siguiente:

View textfield = findViewById(R.id.textfield); 
textfield .setOnClickListener(new View.OnClickListener() { 
public void onClick(View v) { 
/*your code for the click event here*/ }}); 

si quieres un botón de retroceso, hacer esto:

public void backSpace() { 
EditText textfield = (EditText)findViewById(R.id.textfield); 
    try { 
     textfield.getText().delete(textfield.getSelectionEnd() - 1, textfield.getSelectionStart()); 
    } catch (Exception e) { 
     try { 
      textfield.getText().delete(textfield.length() - 1, textfield.length()); 
     } catch (Exception myException) { 
     //textfield.getText().delete(textfield.length(), textfield.length() - 1); 
     } 
    } 
} 

si quieres para agregar un carácter en EditText, haga esto:

EditText textfield = (EditText)findViewById(R.id.textfield); 
textfield.setText(textfield.getText().concat("112")); 
+0

Esto no trabajará. El cursor puede estar en cualquier parte del texto de edición y esto solo elimina caracteres del final del texto. El OP desea enviar una "pulsación de tecla virtual" al texto de edición. – Torben

+1

esto no los elimina del final del texto, esto los quita desde el principio de la selección hasta el final de la selección, y si no hay selección, lo elimina del carácter que sea después del cursor. – Ephraim

1

para simular tecla de retroceso, solo código de anuncios

editText.setText(editText.getText().substring(0,editText.getText().length()-1)) 
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 

para simular la adición de un personaje, poner el código

editText.setText(editText.getText() + (char) charCode) 

GetWindow() setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE).;

+0

Eso solo elimina texto del final de la cadena. ¿Qué pasa si el cursor está en el medio de la cadena? – Torben

7

Su pregunta no es del todo clara, pero creo que desee modificar/añadir texto a un TextView cuando se presionan ciertos botones. Si es así, quiere una combinación de algunas de las respuestas existentes.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    (TextView) textView = (TextView) findViewById(R.id.myTextView); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    switch(keyCode) { 
    case KeyEvent.KEYCODE_BACK: 
     // user pressed the "BACK" key. Append "_back" to the text 
     textView.append("_back"); 
     return true; 
    case KeyEvent.KEYCODE_DEL: 
     // user pressed the "BACKSPACE" key. Append "_del" to the text 
     textView.append("_del"); 
     return true; 
    default: 
     return super.onKeyDown(keyCode, event); 
    } 
} 

Ya sea para volver true para cada caso se han manejado (como el anterior) o para volver siempre super.onKeyDown(keyCode, event); después de su declaración switch dependerá de sus necesidades exactas. Consulte la documentación para conocer el comportamiento de onKeyDown

Si, en lugar de agregar texto en cada caso desea eliminar un carácter, o mover el cursor, puede hacerlo en cada instrucción case. Eche un vistazo al TextView documentation para los diferentes métodos que puede llamar. También consulte el KeyEvent documentation para obtener una lista de las claves que puede verificar.

1

Echa un vistazo a este artículo: creating-input-method.html. Básicamente, puede enviar manualmente KeyEvents o puede manualmente edit and commit text around the cursor en la aplicación Input View. Todo esto se hace a través de su IME InputConnection.

Espero que esto ayude,

14

Para enviar una tecla de retroceso simulada, presione EditText para enviar eventos de presionar y soltar teclas. De esta manera:

mEditText.dispatchKeyEvent(new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 
    KeyEvent.KEYCODE_DEL, 0)); 
mEditText.dispatchKeyEvent(new KeyEvent(0, 0, KeyEvent.ACTION_UP, 
    KeyEvent.KEYCODE_DEL, 0)); 

Esto puede ser usado para enviar cualquier otro código de la llave, no sólo eliminar.

Cuestiones relacionadas