Já faz um tempo desde que você perguntou, mas eu só tive o mesmo problema. Como já mencionado por Estel, o problema com os principais ouvintes é que eles só funcionam com teclados de hardware. Para fazer isso com um IME (teclado virtual) , a solução é um pouco mais elaborada.
O método único que realmente queremos substituir está sendKeyEvent
na classe EditText
's InputConnection
. Este método é chamado quando os principais eventos ocorrem em um IME. Mas, para substituir isso, precisamos implementar um costume EditText
que substitua o onCreateInputConnection
método, envolvendo o InputConnection
objeto padrão em uma classe proxy! : |
Parece complicado, mas aqui está o exemplo mais simples que eu poderia inventar:
public class ZanyEditText extends EditText {
private Random r = new Random();
public ZanyEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ZanyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ZanyEditText(Context context) {
super(context);
}
public void setRandomBackgroundColor() {
setBackgroundColor(Color.rgb(r.nextInt(256), r.nextInt(256), r
.nextInt(256)));
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return new ZanyInputConnection(super.onCreateInputConnection(outAttrs),
true);
}
private class ZanyInputConnection extends InputConnectionWrapper {
public ZanyInputConnection(InputConnection target, boolean mutable) {
super(target, mutable);
}
@Override
public boolean sendKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
ZanyEditText.this.setRandomBackgroundColor();
// Un-comment if you wish to cancel the backspace:
// return false;
}
return super.sendKeyEvent(event);
}
}
}
A linha com a chamada para setRandomBackgroundColor
é onde minha ação especial de backspace ocorre. Nesse caso, alterando a EditText
cor de fundo do.
Se você estiver inflando isso a partir do XML, lembre-se de usar o nome completo do pacote como a tag:
<cc.buttfu.test.ZanyEditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/somefield"
></cc.buttfu.test.ZanyEditText>