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

Andrew
fonte

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.

Paul Maserrat
fonte
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;
    }
});
Andrew
fonte
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) {

        }
    }
});
Prashant Maheshwari Andro
fonte
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.

pixel
fonte
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);
Ashana.Jackol
fonte
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)
Laert
fonte
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);
Priya Rajan
fonte
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);
}
Giedrius Šlikas
fonte
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);
Affa Musaffa
fonte
"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}
Farruh Habibullaev
fonte
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)
norbDEV
fonte
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);
}
Pankaj Talaviya
fonte
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);
CacheMeOutside
fonte
-2

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

Terranologia
fonte