2010-08-24 20 views

risposta

283

Si desidera disabilitare o ignorare una tastiera virtuale?

Se si vuole licenziare solo che è possibile utilizzare le seguenti righe di codice nelle vostre del pulsante su evento Click

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

+1. Funziona come un fascino. –

+1

Due problemi con questo .... uno è che myEditText deve essere Final. Il secondo è che devo sapere quale casella EditText ha il focus. Qualche soluzione a questo? –

+66

Per chiunque altro inciampi qui, è possibile utilizzare l'attività (o l'attività in cui ci si trova oi frammenti 'getActivity()') 'getCurrentFocus(). GetWindowToken()' per il primo argomento a 'hideSoftInputFromWindow()'. Inoltre, fallo in 'onPause()' e non in 'onStop()' se stai cercando di farla sparire quando cambi attività. –

13

è anche possibile utilizzare questo codice su tasto evento click

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 
+0

Quel metodo era l'unico che funzionava per me, grazie! – Emilio

+11

Hmm. Questo non funziona affatto per me. – tomwhipple

+0

Non funziona per me sull'API 23 –

5

Il la prima soluzione con InputMethodManager ha funzionato come un campione per me, il metodo getWindow(). setSoftInputMode non ha funzionato su Android 4.0.3 HTC Amaze.

@Ethan Allen, non ho bisogno di rendere il testo di modifica finale. Forse stai usando una classe interna EditText che hai dichiarato il metodo di contenimento? Potresti rendere EditText una variabile di classe dell'Attività. O semplicemente dichiarare un nuovo EditText all'interno della classe interna/metodo e utilizzare findViewById() di nuovo. Inoltre, non ho trovato che avevo bisogno di sapere quale EditText nel modulo aveva il focus. Potrei sceglierne uno arbitrariamente e usarlo. In questo modo:

+3

Benvenuti in Stack Overflow! Questo è davvero un commento, non una risposta. Con un po 'più di ripetizione, [sarai in grado di postare commenti] (http://stackoverflow.com/privileges/comment). – Jack

+2

È una risposta corretta. Grazie Andy! –

50

Questa soluzione non funziona per tutto il dispositivo e inoltre è usando EditText come parametro. Questa è la mia soluzione, basta chiamare questo metodo semplice:

private void hideSoftKeyBoard() { 
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); 

    if(imm.isAcceptingText()) { // verify if the soft keyboard is open      
     imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); 
    } 
} 
+1

punto fantastico, grazie – Fattie

+2

'isAcceptingText()' ha reso questa risposta migliore di altri – user1506104

22

Questa è la mia soluzione

public static void hideKeyboard(Activity activity) { 
    View v = activity.getWindow().getCurrentFocus(); 
    if (v != null) { 
     InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 
    } 
} 
4
public static void hideSoftInput(Activity activity) { 
    try { 
     if (activity == null || activity.isFinishing()) return; 
     Window window = activity.getWindow(); 
     if (window == null) return; 
     View view = window.getCurrentFocus(); 
     //give decorView a chance 
     if (view == null) view = window.getDecorView(); 
     if (view == null) return; 

     InputMethodManager imm = (InputMethodManager) activity.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
     if (imm == null || !imm.isActive()) return; 
     imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
} 
3

Ecco una soluzione Kotlin (mescolando le varie risposte in discussione)

creare un funzione di estensione (forse in una classe ViewHelpers comune)

fun Activity.dismissKeyboard() { 
    val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 
    if(inputMethodManager.isAcceptingText) 
     inputMethodManager.hideSoftInputFromWindow(this.currentFocus.windowToken, /*flags:*/ 0) 
} 

Poi semplicemente consumano utilizzando:

// from activity 
this.dismissKeyboard() 

// from fragment 
activity.dismissKeyboard()