Ich muss auf Tastendruck für eine Art Terminalemulation hören. Also habe ich keine EditText
. Aber ich laichen erfolgreich die Soft-Tastatur vonAbfragen der Eingabetaste funktioniert nicht in Android-Softkeyboards
public class Click implements View.OnClickListener
{
@Override
public void onClick (View view)
{
CursorText terminal = (CursorText) findViewById (R.id.term_window);
InputMethodManager manager;
manager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE);
manager.showSoftInput (terminal, InputMethodManager.SHOW_FORCED);
}
}
Die Variable terminal
hier ist eine Instanz einer benutzerdefinierten Klasse CursorText
, die von TextView
abgeleitet ist. Es hat das Attribut android:textIsSelectable="true"
, so dass es Klicks akzeptiert. Ansonsten hat es android:imeOptions="flagNoExtractUi|flagForceAscii"
, aber diese scheinen keine nachteiligen Auswirkungen zu haben.
Mein Problem empfängt jetzt die Tastenanschläge. Wenn man die API-Dokumentation betrachtet, sieht es so aus, als ob es keinen zuverlässigen Weg gäbe, da in jeder relevanten Dokumentation angegeben ist, dass die Klassen und Methoden, die beschrieben werden, nur für Hardwaretastaturen funktionieren! Aber es muss einen Weg geben.
Ich habe versucht, eine Reihe von Ansätzen, mit onKeyListener
, onKeyPreIme
usw., die meisten überhaupt nicht reagieren. Zum Beispiel onKeyPreIme
muss in einer Klasse von View
überschrieben werden, in meinem Fall die offensichtliche Wahl ist die Klasse terminal
ist eine Instanz von. Es ist kein EditText
, und vielleicht ist das der Grund onKeyPreIme
wird nie aufgerufen. Ich glaube, ich kann in meinem Fall aus dem gleichen Grund keine TextWatcher
verwenden.
Das beste Ergebnis bisher ist von onKeyDown
in der Aktivität überschreiben. Diese Methode wird für fast jeden Schlüssel einschließlich Backspace aufgerufen; Die einzige Ausnahme ist der wichtigste Schlüssel, der Enter (Return) -Schlüssel. Ich habe das Gefühl, dass eine andere Listener-Methode vor mir aufgerufen wird und die Enter-Key-Ereignisse nicht verarbeitet, sondern weitergibt. Ich weiß nicht, wie ich es herausfinden soll.
Das andere Problem, das ich mit onKeyDown
habe, ist, dass es keine automatische Wiederholung beim Halten einer Taste erzeugt. Da es nur KeyEvent.ACTION_DOWN
, aber keine KeyEvent.ACTION_UP
zu melden scheint, kann ich keine automatische Wiederholung erstellen.
Ich denke, ich könnte ohne Auto-Wiederholung leben, aber ohne Enter-Taste ist ein Show-Stopper. Wie kann ich Enter-Key-Ereignisse entsperren? Was verhindert, dass onKeyDown
aufgerufen wird, wenn ich die Eingabetaste drücke? Oder, alternativ, sollte ich eine völlig andere Art des Tastenanschlags wählen?
BTW. Ich teste auf Lollipop und Kitkat, sowohl CM auf echter Hardware als auch Vintage-Google-Android auf dem Emulator, um Jelly Bean und später zu unterstützen.