Minęło trochę czasu, odkąd pytałeś, ale ja miałem ten sam problem. Jak już wspomniał Estel, problem z kluczowymi słuchaczami polega na tym, że działają one tylko z klawiaturami sprzętowymi. Aby to zrobić za pomocą IME (klawiatura miękka) , rozwiązanie jest nieco bardziej skomplikowane.
Jednolity sposób właściwie chcemy nadpisać jest sendKeyEvent
w w EditText
„s InputConnection
klasy. Ta metoda jest wywoływana, gdy w edytorze IME wystąpią kluczowe zdarzenia. Ale aby to przesłonić, musimy zaimplementować niestandardową, EditText
która przesłania onCreateInputConnection
metodę, opakowując domyślny InputConnection
obiekt w klasę proxy! : |
Brzmi skomplikowanie, ale oto najprostszy przykład, jaki mogłem wymyślić:
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);
}
}
}
Linia z wywołaniem setRandomBackgroundColor
jest miejscem, w którym następuje moja specjalna akcja cofania. W takim przypadku zmianaEditText
koloru tła.
Jeśli zawyżasz to z XML, pamiętaj, aby użyć pełnej nazwy pakietu jako tagu:
<cc.buttfu.test.ZanyEditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/somefield"
></cc.buttfu.test.ZanyEditText>