Chiudi / nascondi la tastiera virtuale Android


Ho un EditText e un Button nel mio layout.

Dopo aver scritto nel campo modifica e cliccando sul Button, voglio nascondere la tastiera virtuale. Presumo che questo sia un semplice pezzo di codice, ma dove posso trovare un esempio di esso?

Author: Vidar Vestnes, 2009-07-10

30 answers

Per contribuire a chiarire questa follia, vorrei iniziare scusandomi a nome di tutti gli utenti Android per il trattamento decisamente ridicolo di Google della tastiera virtuale. Il motivo per cui ci sono così tante risposte, ognuna diversa, per la stessa semplice domanda è perché questa API, come molte altre in Android, è orribilmente progettata. Non riesco a pensare a un modo educato per dichiararlo.

Voglio nascondere la tastiera. Mi aspetto di fornire ad Android la seguente istruzione: Keyboard.hide(). Fine. Grazie mille molto. Ma Android ha un problema. È necessario utilizzare InputMethodManager per nascondere la tastiera. OK, bene, questa è l'API di Android per la tastiera. MA! Si sono tenuti ad avere un Context al fine di ottenere l'accesso al IMM. Ora abbiamo un problema. Potrei voler nascondere la tastiera da una classe statica o di utilità che non ha alcun uso o necessità di Context. o E MOLTO peggio, l'IMM richiede di specificare cosa View (o peggio ancora, cosa Window) si desidera nascondere la tastiera DA.

Questo è ciò che rende nascondere la tastiera così impegnativo. Caro Google: Quando sto cercando la ricetta per una torta, non c'è RecipeProvider sulla Terra che si rifiuterebbe di fornirmi la ricetta a meno che non risponda prima a CHI sarà mangiata la torta E dove sarà mangiata!!

Questa triste storia termina con la brutta verità: per nascondere la tastiera Android, ti verrà richiesto di fornire 2 forme di identificazione: a Context e a View o a Window.

Ho creato un metodo di utilità statico che può fare il lavoro MOLTO solidamente, a condizione che si chiama da un Activity.

public static void hideKeyboard(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    //Find the currently focused view, so we can grab the correct window token from it.
    View view = activity.getCurrentFocus();
    //If no view currently has focus, create a new one, just so we can grab a window token from it
    if (view == null) {
        view = new View(activity);
    }
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Tieni presente che questo metodo di utilità funziona SOLO quando viene chiamato da un Activity! Il metodo precedente chiama getCurrentFocus della destinazione Activity per recuperare il token finestra corretto.

Ma supponiamo di voler nascondere la tastiera da un EditText ospitato in un DialogFragment? Non è possibile utilizzare il metodo sopra per questo:

hideKeyboard(getActivity()); //won't work

Questo non funzionerà perché passerai un riferimento all'host Fragment Activity, che non avrà alcun focus controllo mentre viene visualizzato Fragment! Wow! Quindi, per nascondere la tastiera dai frammenti, ricorro al livello inferiore, più comune e più brutto:

public static void hideKeyboardFrom(Context context, View view) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Di seguito sono riportate alcune informazioni aggiuntive raccolte da più tempo sprecato a inseguire questa soluzione:

Informazioni su windowSoftInputMode

C'è ancora un altro punto di contesa di cui essere consapevoli. Per impostazione predefinita, Android assegnerà automaticamente lo stato attivo iniziale al primo EditText o controllo attivabile nel Activity. Naturalmente segue che InputMethod (in genere la tastiera virtuale) risponderà all'evento di messa a fuoco mostrandosi. L'attributo windowSoftInputMode in AndroidManifest.xml, se impostato su stateAlwaysHidden, indica alla tastiera di ignorare questa messa a fuoco iniziale assegnata automaticamente.

<activity
    android:name=".MyActivity"
    android:windowSoftInputMode="stateAlwaysHidden"/>

Quasi incredibilmente, sembra non fare nulla per impedire l'apertura della tastiera quando si tocca il controllo (a meno che focusable="false" e/o focusableInTouchMode="false" non siano assegnati al controllo). Apparentemente, l'impostazione windowSoftInputMode si applica solo a automatic focus eventi, non per mettere a fuoco gli eventi attivati da eventi touch.

Pertanto, stateAlwaysHidden è molto mal chiamato davvero. Forse dovrebbe essere chiamato ignoreInitialFocus invece.

Spero che questo aiuti.


AGGIORNAMENTO: altri modi per ottenere un token window

Se non esiste una vista focalizzata (ad esempio può accadere se hai appena modificato i frammenti), ci sono altre viste che forniranno un utile token finestra.

Queste sono alternative per il codice precedente if (view == null) view = new View(activity); Non lo fanno fai riferimento esplicitamente alla tua attività.

All'interno di una classe di frammenti:

view = getView().getRootView().getWindowToken();

Dato un frammento fragment come parametro:

view = fragment.getView().getRootView().getWindowToken();

A partire dal corpo del contenuto:

view = findViewById(android.R.id.content).getRootView().getWindowToken();

AGGIORNAMENTO 2: Cancella il focus per evitare di mostrare nuovamente la tastiera se apri l'app dallo sfondo

Aggiungi questa riga alla fine del metodo:

view.clearFocus();

 1169
Author: rmirabelle, 2018-01-12 14:44:33

È possibile forzare Android a nascondere la tastiera virtuale utilizzando InputMethodManager, chiamando hideSoftInputFromWindow, passando il token della finestra contenente la tua vista focalizzata.

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Ciò costringerà la tastiera a essere nascosta in tutte le situazioni. In alcuni casi si desidera passare InputMethodManager.HIDE_IMPLICIT_ONLY come secondo parametro per assicurarsi di nascondere la tastiera solo quando l'utente non l'ha forzata esplicitamente a comparire (tenendo premuto menu).

Nota: Se si vuole fare questo in Kotlin, usa: context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

 4204
Author: Reto Meier, 2018-06-20 12:38:21

Utile anche per nascondere la tastiera virtuale è:

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

Questo può essere usato per sopprimere la tastiera virtuale finché l'utente non tocca effettivamente la vista editText.

 754
Author: Garnet Ulrich, 2014-11-24 16:07:40

Ho un'altra soluzione per nascondere la tastiera:

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

Qui passare HIDE_IMPLICIT_ONLY alla posizione di showFlag e 0 alla posizione di hiddenFlag. Chiuderà con forza la tastiera virtuale.

 303
Author: Saurabh Pareek, 2016-06-27 15:26:34

La soluzione di Meier funziona anche per me. Nel mio caso il livello superiore della mia app è un tabHost e voglio nascondere la parola chiave quando si cambiano le schede: ottengo il token della finestra dalla vista tabHost.

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
    }
}
 132
Author: mckoss, 2014-11-24 15:54:56

Prova questo codice qui sotto in onCreate()

EditText edtView=(EditText)findViewById(R.id.editTextConvertValue);
edtView.setInputType(0);
 120
Author: Jeyavel, 2018-05-24 18:15:06

Aggiornamento: Non capisco perché questa soluzione non funzioni più ( ho appena provato su Android 23). Si prega di utilizzare la soluzione di Saurabh Pareek invece. Eccolo qui:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

Vecchia risposta:

//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
 113
Author: Nguyen Minh Binh, 2017-05-23 12:10:54
protected void hideSoftKeyboard(EditText input) {
    input.setInputType(0);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}
 67
Author: Sreedev R, 2015-09-30 10:42:26

Se tutte le altre risposte qui non funzionano per te come vorresti, c'è un altro modo per controllare manualmente la tastiera.

Crea una funzione che gestirà alcune delle proprietà di EditText:

public void setEditTextFocus(boolean isFocused) {
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);

    if (isFocused) {
        searchEditText.requestFocus();
    }
}

Quindi, assicurarsi che onFocus del {[4] } si apre / chiude la tastiera:

searchEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (v == searchEditText) {
            if (hasFocus) {
                // Open keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED);
            } else {
                // Close keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
            }
        }
    }
});

Ora, ogni volta che si desidera aprire la tastiera manualmente chiamare:

setEditTextFocus(true);

E per la chiusura della chiamata:

setEditTextFocus(false);
 60
Author: Rotemmiz, 2014-11-24 15:55:42

Saurabh Pareek ha la migliore risposta finora.

Potrebbe anche usare i flag corretti, però.

/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

Esempio di utilizzo reale

/* click button */
public void onClick(View view) {      
  /* hide keyboard */
  ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
      .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

  /* start loader to check parameters ... */
}

/* loader finished */
public void onLoadFinished(Loader<Object> loader, Object data) {
    /* parameters not valid ... */

    /* show keyboard */
    ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
        .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

    /* parameters valid ... */
}
 51
Author: Alex, 2017-05-23 11:55:19

Da così cercando, qui ho trovato una risposta che funziona per me

// Show soft-keyboard:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

// Hide soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
 48
Author: shontauro, 2015-04-24 21:09:51

La risposta breve

Nel tuo OnClick listener chiama il onEditorAction del EditText con IME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
    }
});

Il drill-down

Ritengo che questo metodo sia migliore, più semplice e più allineato con il modello di progettazione di Android. Nel semplice esempio sopra (e di solito nella maggior parte dei casi comuni) avrai un EditText che ha/ha avuto il focus e di solito è stato anche quello di invocare la tastiera in primo luogo (è sicuramente in grado di invocarlo in molti scenari comuni). Allo stesso modo, dovrebbe essere quello di rilasciare la tastiera, di solito che può essere fatto da un ImeAction. Basta vedere come si comporta un EditText con android:imeOptions="actionDone", si desidera ottenere lo stesso comportamento con gli stessi mezzi.


Controlla questa risposta correlata

 42
Author: Alex.F, 2017-05-23 12:10:54

Questo dovrebbe funzionare:

public class KeyBoard {

    public static void show(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
    }

    public static void hide(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
    }

    public static void toggle(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        if (imm.isActive()){
            hide(activity); 
        } else {
            show(activity); 
        }
    }
}

KeyBoard.toggle(activity);
 40
Author: slinden77, 2016-07-15 14:51:17

Sto usando una tastiera personalizzata per inserire un numero esadecimale, quindi non posso far apparire la tastiera IMM...

In v3.2.4_r1 setSoftInputShownOnFocus(boolean show) è stato aggiunto per controllare il tempo o meno per visualizzare la tastiera quando un TextView viene messo a fuoco, ma è ancora nascosto quindi la riflessione deve essere utilizzata:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    try {
        Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
        method.invoke(mEditText, false);
    } catch (Exception e) {
        // Fallback to the second method
    }
}

Per le versioni precedenti, ho ottenuto ottimi risultati (ma tutt'altro che perfetti) con un OnGlobalLayoutListener, aggiunto con l'aiuto di un ViewTreeObserver dalla mia vista root e quindi controllando se la tastiera è mostrata come questo:

@Override
public void onGlobalLayout() {
    Configuration config = getResources().getConfiguration();

    // Dont allow the default keyboard to show up
    if (config.keyboardHidden != Configuration.KEYBOARDHIDDEN_YES) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mRootView.getWindowToken(), 0);
    }
}

Quest'ultima soluzione potrebbe mostrare la tastiera per una frazione di secondo e rovinare le maniglie di selezione.

Quando nella tastiera entra a schermo intero, onGlobalLayout non viene chiamato. Per evitare ciò, utilizzare TextView # setImeOptions (int) o nella dichiarazione XML TextView:

android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"

Aggiornamento: Ho appena trovato quali finestre di dialogo usano per non mostrare mai la tastiera e funziona in tutte le versioni:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
        WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
 38
Author: sergio91pt, 2012-05-28 20:48:33
public void setKeyboardVisibility(boolean show) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(show){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }else{
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
    }
}
 29
Author: shobhan, 2015-06-01 13:36:12

Ho passato più di due giorni a lavorare su tutte le soluzioni pubblicate nel thread e le ho trovate carenti in un modo o nell'altro. Il mio requisito esatto è quello di avere un pulsante che con affidabilità al 100% mostri o nasconda la tastiera su schermo. Quando la tastiera è nel suo stato nascosto non dovrebbe riapparire, indipendentemente dai campi di input su cui l'utente fa clic. Quando è nel suo stato visibile la tastiera non dovrebbe scomparire indipendentemente dai pulsanti che l'utente fa clic. Questo deve lavorare su Android 2.2 + tutta la strada fino ai dispositivi più recenti.

Puoi vedere un'implementazione funzionante di questo nella mia app clean RPN.

Dopo aver testato molte delle risposte suggerite su un certo numero di telefoni diversi (tra cui dispositivi froyo e gingerbread) è diventato evidente che le app Android possono in modo affidabile:

  1. Nascondere temporaneamente la tastiera. Riapparirà di nuovo quando un utente mette a fuoco un nuovo campo di testo.
  2. Mostra la tastiera all'avvio di un'attività e impostare un flag sull'attività che indica che la tastiera dovrebbe sii sempre visibile. Questo flag può essere impostato solo quando un'attività inizializzazione.
  3. Contrassegna un'attività per non mostrare o consentire l'uso di tastiera. Questo flag può essere impostato solo quando un'attività inizializzazione.

Per me, nascondere temporaneamente la tastiera non è abbastanza. Su alcuni dispositivi riappare non appena viene focalizzato un nuovo campo di testo. Poiché la mia app utilizza più campi di testo su una pagina, concentrando una nuova campo di testo farà sì che la tastiera nascosta per pop back up di nuovo.

Sfortunatamente gli elementi 2 e 3 dell'elenco funzionano solo quando viene avviata un'attività. Una volta che l'attività è diventata visibile, non è possibile nascondere o mostrare la tastiera in modo permanente. Il trucco è quello di riavviare effettivamente l'attività quando l'utente preme il pulsante di commutazione della tastiera. Nella mia app quando l'utente preme il pulsante della tastiera, viene eseguito il seguente codice:

private void toggleKeyboard(){

    if(keypadPager.getVisibility() == View.VISIBLE){
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, true);
        i.putExtras(state);

        startActivity(i);
    }
    else{
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, false);
        i.putExtras(state);

        startActivity(i);
    }
}

Ciò causa l'attività corrente per avere il suo stato salvato in un Bundle, e quindi l'attività viene avviata, passando attraverso un booleano che indica se la tastiera deve essere mostrata o nascosta.

All'interno del metodo onCreate viene eseguito il seguente codice:

if(bundle.getBoolean(SHOW_KEYBOARD)){
    ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
    getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

Se viene visualizzata la tastiera virtuale, viene detto a InputMethodManager di mostrare la tastiera e alla finestra viene richiesto di rendere sempre visibile l'input virtuale. Se la tastiera virtuale deve essere nascosta allora il WindowManager.Parametri di layout.FLAG_ALT_FOCUSABLE_IM è impostato.

Questo approccio funziona in modo affidabile su tutti i dispositivi su cui ho testato - da un telefono HTC di 4 anni con Android 2.2 fino a un nexus 7 con 4.2.2. L'unico svantaggio con questo approccio è che devi stare attento con la gestione del pulsante indietro. Poiché la mia app ha essenzialmente una sola schermata (è una calcolatrice), posso sovrascrivere onBackPressed () e tornare alla schermata iniziale dei dispositivi.

 25
Author: Luke Sleeman, 2018-03-06 07:10:29

In alternativa a questa soluzione all around, se si desidera chiudere la tastiera virtuale da qualsiasi punto senza avere un riferimento al campo (EditText) che è stato utilizzato per aprire la tastiera, ma si desidera comunque farlo se il campo è stato focalizzato, è possibile utilizzare questo (da un'attività):

if (getCurrentFocus() != null) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
 24
Author: Saran, 2017-05-23 12:10:54

Grazie a questa risposta SO, ho derivato quanto segue che, nel mio caso, funziona bene quando si scorrono i frammenti di un ViewPager...

private void hideKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

private void showKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
    }
}
 21
Author: ban-geoengineering, 2017-05-23 12:34:58

Le risposte precedenti funzionano per scenari diversi ma Se vuoi nascondere la tastiera all'interno di una vista e lottare per ottenere il contesto giusto prova questo:

setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        hideSoftKeyBoardOnTabClicked(v);
    }
}

private void hideSoftKeyBoardOnTabClicked(View v) {
    if (v != null && context != null) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

E per ottenere il contesto recuperarlo dal costruttore:)

public View/RelativeLayout/so and so (Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
    init();
}
 18
Author: Ash, 2015-04-24 21:10:37

Se si desidera chiudere la tastiera virtuale durante un'unità o un test funzionale, è possibile farlo facendo clic sul pulsante "Indietro" dal test:

// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

Metto "back button" tra virgolette, poiché quanto sopra non attiva onBackPressed() per l'attività in questione. Si chiude solo la tastiera.

Assicurati di mettere in pausa un po 'prima di passare, poiché ci vuole un po' di tempo per chiudere il pulsante Indietro, quindi i clic successivi alle Viste, ecc., non sarà registrato fino a dopo una breve pausa (1 il secondo è abbastanza lungo ime).

 17
Author: Peter Ajtai, 2011-12-13 21:55:41

Ecco come si fa in Mono per Android (AKA MonoDroid)

InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
    imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);
 14
Author: BahaiResearch.com, 2012-05-15 01:36:10

Questo ha funzionato per me per tutto il bizzarro comportamento della tastiera

private boolean isKeyboardVisible() {
    Rect r = new Rect();
    //r will be populated with the coordinates of your view that area still visible.
    mRootView.getWindowVisibleDisplayFrame(r);

    int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top);
    return heightDiff > 100; // if more than 100 pixels, its probably a keyboard...
}

protected void showKeyboard() {
    if (isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (getCurrentFocus() == null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    } else {
        View view = getCurrentFocus();
        inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_FORCED);
    }
}

protected void hideKeyboard() {
    if (!isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View view = getCurrentFocus();
    if (view == null) {
        if (inputMethodManager.isAcceptingText())
            inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
    } else {
        if (view instanceof EditText)
            ((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug
        inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}
 13
Author: Pinhassi, 2015-04-24 21:11:16

Aggiungi alla tua attività android:windowSoftInputMode="stateHidden" nel file Manifest. Esempio:

<activity
            android:name=".ui.activity.MainActivity"
            android:label="@string/mainactivity"
            android:windowSoftInputMode="stateHidden"/>
 13
Author: NickUnuchek, 2016-02-04 12:21:40

Usa questo

this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
 11
Author: Atish Agrawal, 2013-08-09 13:42:00

Per il mio caso, stavo usando a SearchView nella actionbar. Dopo che un utente esegue una ricerca, la tastiera si aprirà di nuovo.

L'utilizzo di InputMethodManager non ha chiuso la tastiera. Ho dovuto clearFocus e impostare il focusable della vista di ricerca su false:

mSearchView.clearFocus();
mSearchView.setFocusable(false);
 11
Author: tommy chheng, 2015-04-24 21:10:48

Ho quasi provato tutte queste risposte, ho avuto alcuni problemi casuali soprattutto con il Samsung galaxy s5.

Quello che finisco è forzare lo spettacolo e nascondere, e funziona perfettamente:

/**
 * Force show softKeyboard.
 */
public static void forceShow(@NonNull Context context) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

/**
 * Force hide softKeyboard.
 */
public static void forceHide(@NonNull Activity activity, @NonNull EditText editText) {
    if (activity.getCurrentFocus() == null || !(activity.getCurrentFocus() instanceof EditText)) {
        editText.requestFocus();
    }
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
 11
Author: ahmed_khan_89, 2015-05-15 12:40:06

In alcuni casi questo metodo può funzionare ad eccezione di tutti gli altri. Questo salva la mia giornata:)

public static void hideSoftKeyboard(Activity activity) {
    if (activity != null) {
        InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (activity.getCurrentFocus() != null && inputManager != null) {
            inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
            inputManager.hideSoftInputFromInputMethod(activity.getCurrentFocus().getWindowToken(), 0);
        }
    }
}

public static void hideSoftKeyboard(View view) {
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputManager != null) {
            inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}
 11
Author: iscariot, 2016-02-04 11:46:12

Metodo semplice e facile da usare, basta chiamare hideKeyboardFrom(YourActivity.questo); per nascondere la tastiera

/**
 * This method is used to hide keyboard
 * @param activity
 */
public static void hideKeyboardFrom(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
 11
Author: Naveed Ahmad, 2017-02-21 06:52:20

Basta usare questo codice ottimizzato nella tua attività:

if (this.getCurrentFocus() != null) {
    InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
 10
Author: Hamid FzM, 2015-04-24 21:11:54

Ho il caso, dove il mio EditText può essere posizionato anche in un AlertDialog, quindi la tastiera dovrebbe essere chiusa al licenziamento. Il seguente codice sembra funzionare ovunque:

public static void hideKeyboard( Activity activity ) {
    InputMethodManager imm = (InputMethodManager)activity.getSystemService( Context.INPUT_METHOD_SERVICE );
    View f = activity.getCurrentFocus();
    if( null != f && null != f.getWindowToken() && EditText.class.isAssignableFrom( f.getClass() ) )
        imm.hideSoftInputFromWindow( f.getWindowToken(), 0 );
    else 
        activity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );
}
 10
Author: injecteer, 2015-04-24 21:12:20