24 Stimmen

onKeyListener funktioniert nicht auf der virtuellen Tastatur

Ich verstehe nicht, warum dieser Teil des Codes nicht funktioniert. Nur die Rücktaste und die Eingabetaste werden erkannt. Für alle anderen Tasten wird kein Listener ausgelöst. Mein Gerät ist Nexus One.

Ich habe versucht, die OnKeyDown-Methode der Aktivität außer Kraft zu setzen, und das ist noch schlimmer. Die einzige erkannte Taste war die Zurück-Taste der Hardware.

Ich sehe rund um einen Vorschlag zu TextWatcher und onTextChanged verwenden, während das in einigen Fällen funktionieren könnte, ist es nicht eine echte Arbeit herum. Zum Beispiel, wenn Textbox leer ist, werden Sie nicht erkennen, wenn Benutzer BackSpace(Delete) Taste drücken. Also irgendwelche Ideen?

        TextView txtInput = (TextView)findViewById(R.id.txtInput);
    txtInput.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            makeToast(keyCode + " key pressed");
            return true;
        }
    });

19voto

bobetko Punkte 4810

Ok. Ich habe endlich herausgefunden, wie ich das machen kann, was ich will, und ich bin nicht stolz darauf, dass ich das mit Android mache.

Ich schreibe eine Server/Client-Anwendung, bei der ich auf dem Client ein SoftKeyboard öffnen und gedrückte Tasten (Zeichen und die Entf-Taste) senden muss... Jedes Mal, wenn eine Taste gedrückt wird, wird dieses Zeichen an den Server gesendet. Wenn DEL gedrückt wird, sende ich die Sequenz {BS} an den Server.

Um das zu tun, musste ich TextWatcher und onTextChange implementieren, was gut funktioniert, außer in der Situation, wenn EditText leer ist und der Benutzer die DEL-Taste drückt. Da es keine Änderung in EditText gibt, gibt es keine Möglichkeit zu erkennen, dass die Entf-Taste gedrückt wird.

Zusätzlich zum TextWatcher musste ich onKeyListener implementieren, den ich an mein EditText-Steuerelement angehängt habe. Dieser onKeyListener ignoriert alle Tasten auf dem SoftKeyboard außer DEL und RETURN. Keine Ahnung, warum? Vielleicht ein Fehler?

Hier ist mein Code:

    TextView txtInput = (TextView)findViewById(R.id.txtInput);
    txtInput.addTextChangedListener(inputTextWatcher);

    txtInput.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.d(TAG, keyCode + " character(code) to send");
            return false;
        }
    });

und TextWatcher....

private TextWatcher inputTextWatcher = new TextWatcher() {
    public void afterTextChanged(Editable s) { }
    public void beforeTextChanged(CharSequence s, int start, int count, int after)
        { }
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Log.d(TAG, s.charAt(count-1) + " character to send");;          
    }
};

4voto

Labeeb Panampullan Punkte 33641

Sie haben hier einen Fehler gemacht.
sollte es return true Wenn Sie das Ereignis behandelt haben. Wenn Sie wollen ermöglichen, dass das Ereignis vom nächsten Empfänger behandelt wird , return false
Sie liefern immer true

4voto

Hinweis: inputtype wird in Ihrem Editiertext erwähnt.

<EditText android:id="@+id/select_category" 
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textCapSentences|textAutoCorrect" >

edittext.setOnEditorActionListener(new OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

                if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) {
                    //do something here.
                    return true;
                }
                return false;
            }
        });

3voto

Adam A. Punkte 141

Haben Sie versucht, die spezifische Hörer-Unterklasse für diese Ansicht zu verwenden?

Ich hatte ein ähnliches Problem mit einem EditText. Der folgende Code hat funktioniert:

private OnKeyListener keyListener = new EditText.OnKeyListener(){

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        EditText et = (EditText) v;
        Log.i("APPEVENT", "Key hit: "+ event);
        //...
        return false;
    }

};

Aber wenn ich die View.OnKeyListener Ich nehme nur Backspace und Enter auf. Es könnte ein ähnliches Problem sein mit TextView . Vielleicht reagieren die Zuhörer der Unterklassenschlüssel auf mehr Ereignisse für die gegebene View Unterklasse.

3voto

Referenzierung von:

http://developer.Android.com/reference/Android/view/View.OnKeyListener.html

View.OnKeyListener

Klassenübersicht Schnittstellendefinition für einen Callback, der aufgerufen wird, wenn ein Hardware-Tastenereignis an diese Ansicht gesendet wird. Der Callback wird aufgerufen, bevor das Tastenereignis an den View übergeben wird. Dies ist nur für Hardware-Tastaturen nützlich; eine Software-Eingabemethode ist nicht verpflichtet, diesen Listener auszulösen.

Es scheint, dass OnKeyListener nur für HARDWARE-Schlüssel entwickelt wurde!

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