2012-10-23 15 views
14

Ho un'applicazione e devo chiudere il pannello di controllo su una quantità piuttosto grande di azioni. Ad esempio, quando clic su un pulsante, quando un nuovo layout è disegnato, su schermo di modifica dell'orientamento, quando il controllore dice utente per, eccetera. Uso le opzioni MenuMenu per capovolgere la vista con ViewFlipper, e ovviamente voglio nascondere la tastiera nella vista ruotata (non ci sono campi di input lì).Nascondere in modo affidabile il softkey

ho provato questi finora e dica perché questi non sono affidabili:

Questo non ha funzionato perché ho un sacco di editTexts, e altri punti di vista. Ho bisogno di uno più generico, uno che non richiede una vista come argomento, se possibile.

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

Questo non funziona affatto per me:

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

Questo funziona, ma si apre subito la tastiera di nuovo quando la vista è capovolto.

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); 
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); 

Questo funziona a volte, ma getCurrentFocus() restituisce null la maggior parte del tempo.

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

Questo funziona solo se la tastiera è indicato:

getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); 

Questo non funziona con l'EditText come il primo pezzo di codice, ma con la layout radice, che cambia variazione dell'orientamento e ogni volta che viene chiamato oncreate. Ho un layout XML diverso per orizzontale/verticale e normale/grande. Tutti i layout radice hanno l'ID root. Funziona bene la prima volta, ma dopo non funziona più.

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

Bottomline: Ho provato Hella sacco di metodi nascondigli SoftKeyboard, ma nessuno di loro sembra funzionare in modo affidabile. Esiste un metodo per nascondere la tastiera virtuale in modo affidabile?

risposta

6

Dal momento che avete bisogno di un EditText per far apparire la tastiera, trovare il particolare e utilizzare il primo metodo si visualizzata per nascondere la tastiera:

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

Tuttavia, è necessario che EditText. In primo luogo, ottenere tutte le viste:

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)); 
     } 
    } 
} 

Quindi, ottenere un EditText che è visibile.

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; 
} 

chiamata da qualche parte:

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

con questo, chiamare il metodo nascondiglio.

+0

Dopo alcuni test, questo sembra essere il metodo più affidabile. – stealthjong

+0

Puoi inviare un esempio di codice? dove dovrei mettere Toolkit.getEditText (((ViewParent) findViewById (android.R.id.content)). getChildAt (0)); ? – eyal

+0

Sposami !! Stavo cercando una buona soluzione per così tanto tempo. Sembra che ne abbia trovato uno bello (e breve). Grazie! –

4

Questo funziona per me sempre:

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

Non per me, a volte funziona, il 90% delle volte non lo fa – stealthjong

9

Penso che se si gestisce il caso nulla di getCurrentFocus(), sei a posto. Io uso il metodo qui sotto e funziona come un fascino!

 /* 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

Quando si utilizza il viewflipper, il focus della vista è nullo e quindi la tastiera non è nascosta. Probabilmente un problema con viewFlipper? modifica: probabilmente no, lo schermo ruotante non nasconde la tastiera o – stealthjong

+0

Sei sicuro di passare l'attività corretta e di chiamare il metodo nella posizione corretta? Penso che View focus non debba essere nullo, se la tastiera è aperta. – ayorhan

0

Solo questa soluzione ha funzionato per me:

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

ho avuto un dialogo con il campo di input, nascondendo la finestra di dialogo non ha ancora nascondere la tastiera su tablet.

0

Questo dovrebbe funzionare per la maggior parte dei casi.

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

Non c'è bisogno di preoccuparsi anche del puntatore nullo.

Problemi correlati