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.