2011-01-24 11 views
9

Ad esempio, inviare un tasto backspace al controllo di testo di modifica per rimuovere un carattere o inviare un codice char come 112 per aggiungere un carattere nel controllo di edittext a livello di programmazione.Come inviare un evento chiave a un testo di modifica

In realtà, ho bisogno di un metodo come

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. 
} 

risposta

1

Verificare la presenza di eventi chiave della vostra attività. per esempio, questo codice ascolto per back Pressione:

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

non volevo, ho bisogno di impostare una chiave a livello di programmazione – virsir

1

provare l'attuazione di interfaccia TextWatcher.

dispone di 3 metodi che è necessario eseguire l'override.

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) { 
} 

Penso che funzionerà.

+0

Non voglio monitorare la modifica del testo di modifica, ma voglio impostare alcuni caratteri nel controllo di modifica soprattutto per alcuni tasti speciali come 'backspace' – virsir

1

basta usare il metodo setText per farlo. Se vuoi simulare un backspace puoi fare qualcosa di simile.

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

se si desidera un ascoltatore clic, il modo migliore per farlo è questo:

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

se volete un tasto backspace, fare questo:

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

se si desidera per aggiungere un carattere in EditText, fare questo:

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

Questo non funzionerà. Il cursore può trovarsi ovunque nel testo di modifica e rimuove solo i caratteri dalla fine del testo. L'OP vuole inviare una "pressione virtuale della chiave" al testo di modifica. – Torben

+1

questo non li rimuove dalla fine del testo, questo li rimuove dall'inizio della selezione fino alla fine della selezione e, se non vi è alcuna selezione, lo rimuove dal carattere che si trova dopo il cursore. – Ephraim

1

per simulare tasto backspace, proprio codice degli annunci

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

per simulare l'aggiunta di un carattere, inserire il codice

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

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

+0

Questo rimuove solo il testo dalla fine della stringa. Cosa succede se il cursore si trova nel mezzo della stringa? – Torben

7

La tua domanda non è poi così chiaro, ma penso che si desidera modificare/aggiungere testo ad un TextView quando vengono premuti alcuni pulsanti. Se è così, vuoi una combinazione di alcune delle risposte esistenti.

@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); 
    } 
} 

se tornare true per ogni caso che avete gestito (come sopra) o per tornare sempre super.onKeyDown(keyCode, event); dopo vostro switch dichiarazione dipenderà vostre esigenze. Controllare la documentazione sul comportamento di onKeyDown

Se, invece di accodare il testo in ciascun caso, si desidera eliminare un carattere o spostare il cursore, è possibile farlo in ogni istruzione case. Dai uno sguardo allo TextView documentation per i diversi metodi che puoi chiamare. Guarda anche lo KeyEvent documentation per un elenco delle chiavi che puoi controllare.

1

Dai un'occhiata a questo articolo: creating-input-method.html. In sostanza, è possibile inviare manualmente KeyEvents oppure è possibile effettuare manualmente il edit and commit text around the cursor nell'applicazione Input View. Tali operazioni vengono eseguite tramite l'IME InputConnection.

Spero che questo aiuti,

14

Per inviare un tasto di backspace simulato, premere su EditText per inviare sia la pressione dei tasti che gli eventi di rilascio. In questo modo:

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

Questo può essere utilizzato per inviare qualsiasi altro codice chiave, non solo eliminare.

Problemi correlati