Fechar teclado virtual ao pressionar o botão


133

Eu tenho um Activitycom um EditText, um botão e um ListView. O objetivo é digitar uma tela de pesquisa EditText, pressione o botão e faça com que os resultados da pesquisa preencham esta lista.

Tudo está funcionando perfeitamente, mas o teclado virtual está se comportando de maneira estranha.

Se clicar no botão EditText, obtenho o teclado virtual. Se eu clicar no botão "Concluído" no teclado virtual, ele desaparecerá. No entanto, se eu clicar no botão de pesquisa antes de clicar em "Concluído" no teclado virtual, o teclado virtual permanece e não consigo me livrar dele. Clicar no botão "Concluído" não fecha o teclado. Altera o botão "Concluído" de "Concluído" para uma seta e permanece visível.

Obrigado pela ajuda

Respostas:


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

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

Eu coloquei isso logo após o onClick(View v)evento.

Você precisa importar android.view.inputmethod.InputMethodManager;

O teclado oculta quando você clica no botão.


55
Nota: (no caso de você querer usar esse método em casos em que talvez não haja foco (por exemplo, onPause (), etc)): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Peter Ajtai

5
Você também precisa importar o Contexto.
Si8

4
CUIDADO: Lança o NPE se o teclado já estiver oculto. Siga o comentário de Peter para evitar isso.
Don Larynx

por que o teclado aparece após um clique em um botão irrelevante? alguém pode fornecer alguma explicação ou um link?
usar o seguinte código

1
Funciona como charme!
ARiF 02/09/19

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

Funciona para mim. Obrigado!
Aman Goyal

29

Use o código abaixo

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
Captura de exceção em vez de simples verificação nula, a sério ?!
Dr vidro

Trabalhando para mim, peles teclado no clique de botão
ashishdhiman2007

solução simples para o que eu precisava: ocultar o teclado depois de clicar no botão de pesquisa.
precisa saber é o seguinte

13

Você deve implementar OnEditorActionListenerpara o seu 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 você oculta o teclado:

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

Você também deve acionar o teclado oculto no botão usando onClickListener

Agora, clicar em 'Concluído' no teclado e botão virtuais fará o mesmo - ocultar o teclado e executar a ação do clique.


Excelente, mas não estou seguindo. Eu acho que o post comeu parte do código (não há nada depois de "public void" no seu exemplo). Tentei setOnEditorActionListner no método onCreate da minha atividade, mas ele não sabe o que é setOnEditorActionListener. Recebo uma notificação "Tipo interno anônimo". (Eu estou fazendo isso no meu método Atividade onCreate) i37.tinypic.com/6ozkig.png
Andrew

1
Parece que existem alguns erros neste código, mas é a ideia certa. Por um lado, a interface OnEditorActionListener é uma classe interna, portanto, é necessário importá-la explicitamente (o Eclipse não fará isso por você neste caso) ou referir-se a ela como TextView.OnEditorActionListener.
MatrixFrog

Estou com alguns problemas. Eu implementei onEditorActionListener (a classe pública SearchActivity estende ListActivity implementa OnClickListener, OnEditorActionListener), anexei um ouvinte ao meu EditText (mSearchText.setOnEditorActionListener (this);), mas o Eclipse não permitirá que eu substitua o manipulador onEditorAction (public) (TextView v, int actionId, evento KeyEvent)). Ele diz que deve substituir um método de superclasse. Alguma ideia?
Andrew

Olá, você pode incorporar seu OnEditorActionListener digitando yourEditView.setOnEditorActionListener (novo OnEditorActionListener () {....
pixel

11

Adicione o seguinte código ao evento de clique no botão:

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

1
Funciona como charme!
Codecpc

10

Como você possui apenas um texto de edição, basta chamar a ação executada para esse texto de edição dentro do clique no botão e o restante é tratado pelo sistema. Se você tivesse mais de um edittext, isso não seria tão eficaz porque você precisa obter o edittext focado primeiro. Mas no seu caso, ele funcionará perfeitamente

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)

1
Você pode deixar uma explicação de por que sua solução funciona para que outras pessoas possam entender e aprender com ela? Obrigado!
Shawn

Shawn claro. I acabou de editar o topo, uma vez im novo para posar se não está claro, deixe-me saber e eu vou expandir com o botão onclick
Laert

Acredite, essa é uma das maneiras mais elegantes de fazer isso. Obrigado @Laert
WitVault 8/17

9

Para Atividade,

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

Para fragmentos, use getActivity ()

getActivity (). getSystemService ();

getActivity (). getCurrentFocus ();

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

7

Esta solução funciona perfeita para mim:

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

Tente isso ...

  1. Para mostrar teclado

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  2. Para ocultar teclado

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

"Para Ocultar teclado" método é uma comutar (esconder, se é visível, mostrar se está escondido) não um hide,
Ninja Codificação

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}

Oi! Embora essa resposta possa ser suficiente para as necessidades do @Andrew , seria ótima, se você pudesse estendê-la com algumas explicações, para garantir que os futuros leitores possam se beneficiar ao máximo!
DerMay

1

Exemplo de Kotlin:

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

de Fragment:

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

da atividade:

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

0

Você usa esse código no evento de clique no botão

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

Correção de exceção de ponto nulo de falha: tive um caso em que o teclado pode não abrir quando o usuário clica no botão. Você deve escrever uma instrução if para verificar se getCurrentFocus () não é nulo:

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

-2

Se você definir android:singleLine="true", automaticamente o botão oculta o teclado ¡

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.