2013-10-28 2 views
7

Ich versuche das "Zurück" -Tastenereignis zu erfassen, wenn die Soft-Tastatur angezeigt wird.Android-Tastenereignis für die Zurück-Taste, wenn die Soft-Tastatur angezeigt wird?

Ich verwende SDK Version 8 und erfolgreich die Rücktaste Ereignis erfassen nur, wenn die Soft-Tastatur verborgen ist wie folgt:

@Override 
public void onBackPressed() { 
    // do something 
    super.onBackPressed(); 
} 

Das Problem ist, dass das System nicht diese Methode während der Soft-Tastatur aufrufen wird gezeigt. Ich habe versucht, onKeyDown/Up() -Methoden sowie die oben genannte Methode zu protokollieren, um herauszufinden, was in diesem Szenario passiert, ohne Erfolg. Siehe unten:

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    //DEBUGGING 
    Log.d(TAG + "KeyUP", String.valueOf(event)); 
} 

Protokolle werden für die Lautstärke und Menütasten zurückgegeben, wie erwartet, aber die Rücktaste wird nur protokolliert, wenn die Soft-Tastatur und Menü versteckt sind.

Gibt es irgendeinen "Zurückschlüssel" -Guru, der dieses Phänomen erklären kann?

Jede Hilfe wird sehr geschätzt.

Antwort

5

Nach dem Graben um weiter auf dieser Seite und die Android API ich, dass

gefunden habe, zu tun

wird von einem IME abgefangen und verschlungen, der eine Eingabemethodenverbindung hat und diese Eingabemethode wird derzeit angezeigt (mit anderen Worten: die Softtastatur ist NICHT versteckt). Dies bedeutet, dass das Ereignis verbraucht wird, bevor das System die Aktivitätsklassen onKeyDown() oder onKeyUp() -Methoden aufruft.

Um dies zu umgehen, erstellen Sie eine Unterklasse Ihres IME-Widgets (TextView oder seine untergeordneten Klassen wie EditText) und implementieren Sie .

Stack-Benutzer i2097i hat eine gute Lösung zur Implementierung von onKeyPreIme() in einer Aktivität here veröffentlicht. Stellen Sie sicher, dass Sie FALSE in Ihrem onKeyPreIme() Override zurückgeben, wenn Sie das Standardverhalten von Androiden beibehalten möchten (d. H. Das Schließen der Tastatur).

0

Normalerweise ist die Zurück-Taste wird die Tastatur (nateve behaivor) verstecken, so ist es keine gute Idee, etwas mit diesen

+0

Ich stimme dir zu Joan, aber in meinem Fall möchte ich nur ein EditText Widget (wenn es sichtbar ist) zusammen mit Androids Standardverhalten verstecken die Tastatur. – dan

5

Dies ist die Art und Weise drücken Sie die Taste Ereignis zu erfassen zurück: 1. Umfang editText Ansicht onKeyPreIme

package com.test.test; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.view.KeyEvent; 
import android.widget.EditText; 

/** 
* Created by sumit.saurabh on 11/10/16. 
*/ 
public class ChatEditText extends EditText 
{ 
    /* Must use this constructor in order for the layout files to instantiate the class properly */ 
    public ChatEditText(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     // TODO Auto-generated constructor stub 
    } 

    private KeyImeChange keyImeChangeListener; 

    public void setKeyImeChangeListener(KeyImeChange listener) 
    { 
     keyImeChangeListener = listener; 
    } 

    public interface KeyImeChange 
    { 
     public void onKeyIme(int keyCode, KeyEvent event); 
    } 

    @Override 
    public boolean onKeyPreIme(int keyCode, KeyEvent event) 
    { 
     if (keyImeChangeListener != null) 
     { 
      keyImeChangeListener.onKeyIme(keyCode, event); 
     } 
     return false; 
    } 
} 
außer Kraft zu setzen
  1. ChatEditText in xml

    <com.test.test.ChatEditText 
         android:id = "@+id/messageEditText" 
         android:layout_width = "match_parent" 
         android:layout_height = "wrap_content" 
         android:layout_gravity = "bottom" 
         android:layout_marginLeft = "12dp" 
         android:layout_marginRight = "30dp" 
         android:background = "@null" 
         android:hint = "Type your message" 
         android:inputType = "textMultiLine" 
         android:singleLine = "false" 
         android:textColorHint = "#c4c0bd" 
         android:textSize = "18sp"/> 
    
  2. Dann hängen Sie einen Listener von überall wie folgt an:

    private ChatEditText messageEditText; 
    messageEditText = 
        (ChatEditText) findViewById(R.id.messageEditText); 
    
    messageEditText.setKeyImeChangeListener(new ChatEditText.KeyImeChange(){ 
        @Override 
        public void onKeyIme(int keyCode, KeyEvent event) 
        { 
         if (KeyEvent.KEYCODE_BACK == event.getKeyCode()) 
         { 
          // do something 
         } 
        }}); 
    
Verwandte Themen