2016-08-02 22 views
1

Auf einem Fragment habe ich den folgenden OnKeyListener. Ich benutze es, um eine interne Ansicht dieses Fragments zu verbergen, wenn es gerade angezeigt wird. Wenn es nicht angezeigt wird, konsumiere ich nicht den Tastendruck und Android tut es auch.OnKeyListener funktioniert nicht mehr, nachdem die Tastatur ausgeblendet wurde

getView().setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if ((keyCode == KeyEvent.KEYCODE_BACK) && (event.getAction() == KeyEvent.ACTION_DOWN)) { 
       if (isSomeViewShowing) { 
        hideSomeView(); 
        return true; 
       } 
       // Back pressed but view is not showing. Not consuming the event. 
       return false; 
      } 
      // Back not pressed. Not consuming the event. 
      return false; 
     } 
    }); 

Es funktioniert gut, die Aussicht und den Einstieg in den normalen Fragmente/Aktivität Backstack zu verstecken, wenn die Aussicht nicht da ist, aber es funktioniert nicht mehr, wenn der Benutzer die Soft-Tastatur zur Eingabe von Text in einem EditText und dann versteckt verwendet die Tastatur.

Ich weiß, dass der OnKeyListener nicht für Soft-Tastaturen funktioniert, und das ist OK für meine Bedürfnisse. Ich brauche nur den Listener, um weiter zu arbeiten, nachdem die Eingabe beendet wurde und die Tastatur ausgeblendet ist.

Gibt es eine Möglichkeit, dies zu verhindern?

Eine Problemumgehung wäre listen for when keyboard is dismissed und den OnKeyListener wieder hinzufügen, wenn die Tastatur abgewiesen wird, aber die Implementierung dieser fügt zu viel Komplexität für eine einfache Aufgabe hinzu.

Antwort

2

Sie könnten onBackPressed() im activity außer Kraft setzen, die die fragment verwendet, und ihnen eine Nachricht an den fragment zu wissen, senden, dass Schlüssel wieder gedrückt wurde. Etwas wie folgt aus:

Aktivität:

/** 
* Triggered when the user press back button 
*/ 
@Override 
public void onBackPressed(){ 

    mYourFragment.onBackPressed(); 

} 

Fragment:

public void onBackPressed(){ 

    if (isSomeViewShowing) { 
     hideSomeView(); 
    } 

} 
+0

Danke. Ich habe dies bei anderen Fragmenten gemacht, aber ich mag es nicht, dass sie nicht ohne Änderungen an der Aktivität implementiert werden können. Ich werde das trotzdem tun, da es die einzige Lösung zu sein scheint, die das Problem wirklich löst. – buzoherbert