2012-10-23 11 views
14

Ich habe eine Anwendung und muss die Softkeyboard auf eine ziemlich große Menge an Aktionen schließen. Wenn zum Beispiel eine Schaltfläche klicken, wenn ein neues Layout gezogen wird, auf Änderung der Bildschirmausrichtung, wenn die Controller sagt die Benutzeroberfläche, et cetera. Ich verwende den OptionsMenuButton, um die Ansicht mit einem ViewFlipper zu spiegeln, und natürlich möchte ich, dass die Tastatur in der umgedrehten Ansicht versteckt ist (dort gibt es kein Eingabefeld).Softkeyboard zuverlässig verdecken

Ich habe diese versucht, so weit und sagen, warum diese nicht zuverlässig sind:

Dieses hat nicht funktioniert, weil ich eine Menge editTexts haben, und andere Ansichten. Ich brauche eine allgemeinere, die, wenn möglich, keine Sicht als Argument erfordert.

InputMethodManager imm = (InputMethodManager)getSystemService(
    Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 

Dieses funktioniert nicht überhaupt für mich:

getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

Dieser funktioniert, aber sofort erscheint die Tastatur wieder, wenn die Ansicht gekippt wird.

Dieser funktioniert manchmal, aber getCurrentFocus() gibt die meiste Zeit null zurück.

InputMethodManager inputManager = (InputMethodManager)    
Context.getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),  
InputMethodManager.HIDE_NOT_ALWAYS); 

Dieser funktioniert nur, wenn die Tastatur angezeigt wird:

getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); 

Dieses funktioniert nicht mit dem EditText wie das erste Stück Code, aber mit der Wurzel-Layout, die auf Orientierungsänderung ändert und jedes Mal, wenn das Oncreate aufgerufen wird. Ich habe verschiedene Layout-XML für Querformat/Hochformat und Normal/Groß. Alle Root-Layouts haben die ID root. Das klappt beim ersten Mal gut, aber danach funktioniert es nicht mehr.

InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(findViewById(R.id.root).getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 

Bottomline: Ich habe versucht, hella viele Softkeyboard Versteck Methoden, aber keiner von ihnen scheint zuverlässig zu arbeiten. Gibt es irgendwelche Methode zum Verstecken der Soft-Tastatur zuverlässig?

Antwort

6

Da Sie eine EditText brauchen die Tastatur zu bringen, finden die insbesondere ein und verwenden Sie die erste Methode, die Sie angezeigt, um die Tastatur auszublenden:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 

Sie werden jedoch, dass EditText benötigen. Zunächst erhalten alle Ansichten:

public static ArrayList<View> getAllViewsFromRoots(View...roots) { 
    ArrayList<View> result = new ArrayList<View>(); 
    for (View root : roots) { 
     getAllViews(result, root); 
    } 
    return result; 
} 

private static void getAllViews(ArrayList<View> allviews, View parent) { 
    allviews.add(parent); 
    if (parent instanceof ViewGroup) { 
     ViewGroup viewGroup = (ViewGroup)parent; 
     for (int i = 0; i < viewGroup.getChildCount(); i++) { 
      getAllViews(allviews, viewGroup.getChildAt(i)); 
     } 
    } 
} 

Dann ein EditText erhalten, die sichtbar ist.

public static EditText getEditText(View root) { 
    ArrayList<View> views = getAllViewsFromRoots(root); 
    for (View view : views) { 
     if (view instanceof EditText && view.getVisibility() == View.VISIBLE) { 
      return (EditText) view; 
     } 
    } 
    return null; 
} 

Anruf irgendwo:

Toolkit.getEditText(((ViewParent) findViewById(android.R.id.content)).getChildAt(0)); 

mit, dass das Versteck Methode aufrufen.

+0

Nach einigen Tests scheint dies die zuverlässigste Methode zu sein. – stealthjong

+0

Können Sie ein Codebeispiel senden? Wo sollte ich Toolkit.getEditText setzen ((ViewParent) findViewById (android.R.id.content)). getChildAt (0)); ? – eyal

+0

Heirate mich !! Ich war so lange auf der Suche nach einer guten Lösung. Scheint, ich fand eine nette (und kurze). Vielen Dank! –

4

Dieser funktioniert immer für mich:

InputMethodManager im = (InputMethodManager) getSystemService(MyActivity.INPUT_METHOD_SERVICE); 
im.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
+0

Nicht für mich, manchmal funktioniert es, 90% der Zeit es nicht – stealthjong

9

Ich denke, wenn man den Null Fall von getCurrentFocus() zu behandeln, du bist gut zu gehen. Ich benutze die Methode unten und es funktioniert wie ein Charme!

 /* Hide Keyboard */ 
    public static void hideKeyboard(Activity activity){ 
     InputMethodManager inputMethodManager = (InputMethodManager)activity 
       .getSystemService(Context.INPUT_METHOD_SERVICE); 
     View focus = activity.getCurrentFocus(); 
     if(focus != null) 
      inputMethodManager.hideSoftInputFromWindow(focus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
    } 
+1

Wenn Sie den Viewflipper verwenden, ist der Ansichtsfokus NULL und somit ist die Tastatur nicht ausgeblendet. Wahrscheinlich ein Problem mit dem ViewFlipper? bearbeiten: wahrscheinlich nicht, rotierenden Bildschirm nicht Tastatur entweder – stealthjong

+0

verbergen Sind Sie sicher, dass Sie die richtige Aktivität übergeben und die Methode an der richtigen Stelle aufrufen? Ich denke, View-Fokus sollte nicht Null sein, wenn die Tastatur geöffnet ist. – ayorhan

0

Nur diese Lösung für mich gearbeitet:

mActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

ich einen Dialog mit Eingabefeld hatte sich der Dialog nur knapp sein Ziel Ausblenden der Tastatur auf Tablet versteckt.

0

Dies sollte für die meisten Fälle funktionieren.

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(new View(this).getWindowToken(), 0); 

Sie müssen sich auch nicht um den Nullzeiger kümmern.