2016-07-07 2 views
0

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.

Antwort

0

SOFTKeyboards erzeugen selten Schlüsselereignisse. Sie arbeiten in der Regel mit dem Aufruf von inputConnection.commitText, das jeweils eine ganze Zeichenfolge übernimmt. Um das zu tun, was Sie wollen, müssen Sie das InputMethod an eine View binden und die onCreateInputConnection der View überschreiben, um eine benutzerdefinierte InputConnection zurückzugeben, die commitText korrekt verarbeiten kann.

Verwandte Themen