20 Stimmen

OnKeyListener funktioniert nicht mit Soft-Tastatur (Android)

Ich verwende onKeyListener, um die onKey-Ereignisse zu erhalten. Es funktioniert gut mit der normalen Tastatur. Aber es funktioniert nicht mit der Bildschirmtastatur. Ich kann nur onKey-Ereignisse für Zahlen und nicht für Buchstaben erhalten. Gibt es einen Workaround, um dieses Problem zu lösen? Jede Art von Hilfe wird sehr geschätzt.

0 Stimmen

Es klingt seltsam, wenn Sie einige Zeichen, aber nicht andere, von der Bildschirmtastatur erhalten. Können Sie den Code Ihres Listeners und den Ort, an dem Sie ihn anhängen, posten?

0 Stimmen

Public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login_screen); emailTxt = (EditText) findViewById(R.id.email); emailTxt.setOnKeyListener(new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { Log.i("Schlüsselwert", String.valueOf(keyCode)); }); }

0 Stimmen

Ich lese jetzt nur die Schlüssel.

13voto

Mark B Punkte 154748

Ich glaube nicht, dass ein OnKeyListener überhaupt mit der Bildschirmtastatur aufgerufen wird. Es hat etwas mit der Bildschirmtastatur als IME-Gerät zu tun und IME-Geräte möglicherweise andere Dinge als Tastaturen sind. Es scheint jedoch onKeyListener ziemlich nutzlos zu machen, da es nur auf Telefonen mit Hardware-Tastaturen funktioniert. Ich habe vor kurzem dieses Problem umgangen, indem ich TextWatcher auf dem EditText-Feld in meiner Aktivität verwendet habe, anstatt OnKeyListener zu verwenden.

9voto

Martin Punkte 91

OnKeyListener hat perfekt auf Android 1.5 über die Bildschirmtastatur funktioniert

Von Android 1.6 an gehen die Buchstaben- und Zahlen-Tasten nicht mehr über das onKey-Ereignis, aber die DEL-Taste schon

Frustrierend

7voto

Nar Gar Punkte 2551

Dies ist wahrscheinlich dumm, aber so funktioniert Android im Moment.

In der Dokumentation heißt es, dass die Tastaturereignisse nur für die Hardware-Tastenanschläge weitergeleitet werden, nicht für die Software.

Die Gerätehersteller werden tatsächlich davon abgeraten, Softkeyboard-Ereignisse über Tastenlistener weiterzuleiten, obwohl es völlig in der Hand des Herstellers liegt, ob er das respektieren möchte oder ob er die Soft- und Hard-Tastaturen tatsächlich gleich behandelt.

Ab Android 4.2.2 wird das Android-System selbst überhaupt keine Tastaturereignisse für die Soft-Tastaturen unterstützen, so dass auch die Hersteller ihren Weg nicht wählen können.

Die einzige narrensichere Option hier ist also, Ihre eigene IME (Softkeyboard) zu implementieren und die Tastenanschläge selbst zu verarbeiten.

TextWatcher kann größtenteils verwendet werden, um die Tastenlistener zu ersetzen, jedoch löst auch editText.setText(...); die TextWatcher-Ereignisse aus. Wenn man also nur an getippten Tasten interessiert ist, ist TextWatcher wahrscheinlich auch keine Lösung.

Bitte seien Sie vorsichtig beim Verwenden von TextWatcher mit AutocomleteTextView oder EditText. Ändern Sie den Text im Inhalt des AutocompleteTextView / EditText nicht innerhalb von TextWatcher-Ereignissen, da Sie ansonsten höchstwahrscheinlich in einer endlosen Ereignis-/Hörschleife landen werden.

Hoffentlich hilft dies, die verfügbaren Optionen zu klären, aber leider bietet es keine funktionierende Lösung.

Enttäuschend, dass Google diesen wichtigen Aspekt ihrer Benutzeroberfläche übersehen hat.

3voto

Mark D Punkte 3247

Dies scheint gerätespezifisch zu sein. Ich kann bestätigen, dass dies auf dem Xoom und dem Acer A100 funktioniert. Allerdings löst das Samsung Galaxy Tab Plus das Ereignis nur für die Nicht-Zeichen-Tasten aus. (Alle Geräte mit Honeycomb-Betriebssystem)

1voto

Funkavenger Punkte 39

Ich habe das umgangen, indem ich den Listener in seine eigene Methode gesteckt und ihn nach dem ersten Mal erneut aufgerufen habe. Im onCreate rufe ich setKeyListenerForEnter(); auf;

Hier ist dann die Methode:

public void setKeyListenerForEnter(){

    final EditText search_entry = (EditText) findViewById(R.id.search_entry);
    search_entry.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // Wenn das Ereignis ein Tastendruckereignis auf der "Enter"-Taste ist
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                (keyCode == KeyEvent.KEYCODE_ENTER)) {
                getSearchResults(v);
                setKeyListenerForEnter();
              return true;
            }
            return false;
        }
    });
}

Ich bin mir nicht sicher, ob dies eine bessere Lösung als die Bearbeitung der IME-Tastatur selbst ist, aber es ist eine Lösung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X