Chiudi tastiera virtuale alla pressione del pulsante


133

Ho un Activitycon un EditText, un pulsante e un ListView. Lo scopo è digitare una schermata di ricerca in EditText, premere il pulsante e fare in modo che i risultati della ricerca popolino questo elenco.

Tutto funziona perfettamente, ma la tastiera virtuale si comporta in modo strano.

Se faccio clic su EditText, ottengo la tastiera virtuale. Se faccio clic sul pulsante "Fine" sulla tastiera virtuale, scompare. Tuttavia, se faccio clic sul pulsante di ricerca prima di fare clic su "Fine" sulla tastiera virtuale, la tastiera virtuale rimane e non riesco a liberarmene. Facendo clic sul pulsante "Fine" non si chiude la tastiera. Cambia il pulsante "Fine" da "Fine" a una freccia e rimane visibile.

Grazie per l'aiuto

Risposte:


304
InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                     InputMethodManager.HIDE_NOT_ALWAYS);

L'ho messo subito dopo l' onClick(View v)evento.

Devi importare android.view.inputmethod.InputMethodManager;

La tastiera si nasconde quando si fa clic sul pulsante.


55
Nota: (nel caso in cui si desideri utilizzare questo metodo in casi in cui potrebbe non esserci focus (ad esempio onPause (), ecc.): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Peter Ajtai,

5
Devi anche importare il contesto.
Si8,

4
ATTENZIONE: genera NPE se la tastiera è già nascosta. Segui il commento di Peter per evitare questo.
Don Larynx,

perché la tastiera viene visualizzata dopo un clic su un pulsante irrilevante? qualcuno può fornire qualche spiegazione o un link?
kommradHomer,

1
Funziona come il fascino!
ARiF

59
mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            // hide virtual keyboard
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(), 
                                      InputMethodManager.RESULT_UNCHANGED_SHOWN);
            return true;
        }
        return false;
    }
});

Per me funziona. Grazie!
Aman Goyal,

29

Usa sotto il codice

your_button_id.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        try  {
            InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {

        }
    }
});

2
Prendere l'eccezione invece del semplice controllo null, sul serio ?!
Dr Glass,

Lavorando per me, nasconde la tastiera al clic del pulsante
ashishdhiman2007

soluzione semplice a ciò di cui avevo bisogno: nascondere la tastiera dopo aver fatto clic sul pulsante di ricerca.
dawoodman71,

13

È necessario implementare OnEditorActionListenerper EditView

public void performClickOnDone(EditView editView, final View button){
    textView.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
            hideKeyboard();
            button.requestFocus();
            button.performClick();
            return true;
        }
    });

E nascondi la tastiera:

public void hideKeybord(View view) {
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
                                  InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

Dovresti anche sparare nascondendo la tastiera nel tuo pulsante usando onClickListener

Ora facendo clic su "Fine" sulla tastiera e sul pulsante virtuali si farà lo stesso: nascondi la tastiera ed esegui l'azione del clic.


Eccellente, ma non sto proprio seguendo. Penso che il post abbia mangiato parte del codice (non c'è nulla dopo "vuoto pubblico" nel tuo esempio). Ho provato a setOnEditorActionListner nel metodo onCreate della mia attività, ma non sa cosa sia setOnEditorActionListener. Ricevo una notifica "Tipo interno anonimo". (Lo sto facendo nel mio metodo Activity onCreate) i37.tinypic.com/6ozkig.png
Andrew

1
Sembra che ci siano un paio di errori in questo codice, ma è l'idea giusta. Per prima cosa, l'interfaccia OnEditorActionListener è una classe interna, quindi è necessario importarla esplicitamente (Eclipse non lo farà in questo caso) o fare riferimento ad essa come TextView.OnEditorActionListener.
MatrixFrog il

Sto avendo un po 'di problemi. Ho implementato onEditorActionListener (la classe pubblica SearchActivity estende ListActivity implementa OnClickListener, OnEditorActionListener), ho attaccato un ascoltatore al mio EditText (mSearchText.setOnEditorActionListener (this);), ma Eclipse non mi consentirà di ignorare onCreditor (onEdc) (TextView v, int actionId, evento KeyEvent)). Dice che deve sovrascrivere un metodo superclasse. Qualche idea?
Andrew

Ciao, puoi incorporare il tuo OnEditorActionListener digitando yourEditView.setOnEditorActionListener (nuovo OnEditorActionListener () {....
pixel

11

Aggiungi il seguente codice all'interno del tuo evento clic pulsante:

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

1
Funziona come il fascino!
coderpc,

10

Dato che hai solo un testo di modifica, basta chiamare l'azione fatta per quel testo di modifica all'interno del tuo pulsante e il resto è gestito dal sistema. Se avessi più di un edittext, questo non sarebbe così efficace perché devi prima ottenere l'edittext mirato. Ma nel tuo caso funzionerà perfettamente

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)

1
Puoi lasciare una spiegazione del perché la tua soluzione funziona in modo che gli altri possano capirla e imparare da essa? Grazie!
Shawn,

Certo Shawn. Ho appena modificato la parte superiore, dal momento che sono nuovo a posare se non è chiaro fammelo sapere e mi espanderò con il pulsante onclick
Laert

Credetemi, questo è uno dei modi più eleganti per farlo. Grazie @Laert
WitVault

9

Per attività,

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

Per i frammenti, usa getActivity ()

. GetActivity () getSystemService ();

. GetActivity () getCurrentFocus ();

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);

7

Questa soluzione funziona perfettamente per me:

private void showKeyboard(EditText editText) {
    editText.requestFocus();
    editText.setFocusableInTouchMode(true);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
    editText.setSelection(editText.getText().length());
}

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

3

Prova questo...

  1. Per mostrare la tastiera

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  2. Per nascondere la tastiera

    InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

Il metodo "Per nascondere la tastiera" è un toogle (nascondi se è visibile, mostra se è nascosto) non un nascondiglio,
Ninja Coding

1
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}

Ciao! Sebbene questa risposta possa essere sufficiente per le esigenze di @Andrew , sarebbe grande, se potessi estenderla con qualche spiegazione, per assicurarti che i futuri lettori possano trarne il massimo beneficio!
derM,

1

Esempio di Kotlin:

val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

dal frammento:

inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

dall'attività:

inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

0

Si utilizza questo codice nell'evento clic pulsante

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

0

Crash Null Point Exception Fix: ho avuto un caso in cui la tastiera potrebbe non aprirsi quando l'utente fa clic sul pulsante. Devi scrivere un'istruzione if per verificare che getCurrentFocus () non sia null:

            InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if(getCurrentFocus() != null) {
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

-2

Se impostato android:singleLine="true", il pulsante nasconde automaticamente la tastiera ¡

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.