Android dispensar teclado

147

Como descartar o teclado quando um botão é pressionado?

Manikandan
fonte
Tornar um EditText focalizável = Falso faz o trabalho. Deseja desativá-lo completamente?
st0le

Respostas:

325

Deseja desativar ou descartar um teclado virtual?

Se você quiser apenas descartá-lo, poderá usar as seguintes linhas de código nos botões, no clique em Evento

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
DeRagan
fonte
1
Dois problemas com isso .... um é que o myEditText precisa ser final. O segundo é que eu tenho que saber qual caixa EditText tem o foco. Alguma solução para isso?
Ethan Allen
78
Para qualquer pessoa que tropeçar aqui, você pode usar as atividades (a atividade em que está ou os fragmentos getActivity()) getCurrentFocus().getWindowToken()para o primeiro argumento hideSoftInputFromWindow(). Além disso, faça isso no onPause()e não no onStop()se você estiver tentando fazê-lo desaparecer ao alterar as atividades.
Drake Clarris
2
Esta resposta, combinada com o comentário aqui em cima, resolveu totalmente o meu problema!
Aveschini 03/10
9
Que abordagem feia e feia para descartar um teclado. Espero que no futuro haja uma maneira mais limpa de fazer uma coisa tão simples.
Subby
73

A solução acima não funciona para todos os dispositivos e, além disso, está usando o EditText como parâmetro. Esta é a minha solução, basta chamar este método simples:

private void hideSoftKeyBoard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

    if(imm.isAcceptingText()) { // verify if the soft keyboard is open                      
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}
user2167877
fonte
3
isAcceptingText()fez esta resposta melhor do que outros
user1506104
Boa solução ... em casos raros, o isAcceptingText () pode retornar falso quando o teclado ainda está na tela, por exemplo, clique fora do EditText para o texto que pode ser selecionado, mas não editado na mesma janela.
Georgie
29

Esta é a minha solução

public static void hideKeyboard(Activity activity) {
    View v = activity.getWindow().getCurrentFocus();
    if (v != null) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }
}
RPM
fonte
Ou seja, se você conhece a exibição que causou a exibição do teclado.
RPM
16

você também pode usar esse código no evento de clique no botão

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Kandha
fonte
13

Aqui está uma solução Kotlin (misturando as várias respostas em um tópico)

Crie uma função de extensão (talvez em uma classe comum do ViewHelpers)

fun Activity.dismissKeyboard() {
    val inputMethodManager = getSystemService( Context.INPUT_METHOD_SERVICE ) as InputMethodManager
    if( inputMethodManager.isAcceptingText )
        inputMethodManager.hideSoftInputFromWindow( this.currentFocus.windowToken, /*flags:*/ 0)
}

Em seguida, consuma usando:

// from activity
this.dismissKeyboard()

// from fragment
activity.dismissKeyboard()
Marchy
fonte
5

A primeira solução com o InputMethodManager funcionou como um campeão para mim, o método getWindow (). SetSoftInputMode não funcionou no Android 4.0.3 HTC Amaze.

@ Ethan Allen, não precisava finalizar a edição do texto. Talvez você esteja usando uma classe interna EditText que você declarou como método de contenção? Você pode tornar o EditText uma variável de classe da Atividade. Ou apenas declare um novo EditText dentro da classe / método interno e use findViewById () novamente. Além disso, não achei que precisava saber qual EditText no formulário tinha foco. Eu poderia escolher um arbitrariamente e usá-lo. Igual a:

    EditText myEditText= (EditText) findViewById(R.id.anyEditTextInForm);  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
Andy
fonte
3
Bem-vindo ao Stack Overflow! Este é realmente um comentário, não uma resposta. Com um pouco mais de rep, você poderá postar comentários .
31412 Jack
4
    public static void hideSoftInput(Activity activity) {
    try {
        if (activity == null || activity.isFinishing()) return;
        Window window = activity.getWindow();
        if (window == null) return;
        View view = window.getCurrentFocus();
        //give decorView a chance
        if (view == null) view = window.getDecorView();
        if (view == null) return;

        InputMethodManager imm = (InputMethodManager) activity.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm == null || !imm.isActive()) return;
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    } catch (Throwable e) {
        e.printStackTrace();
    }
}
androidmalin
fonte
1

Esta solução garante que oculta o teclado e não faça nada se não estiver aberto. Ele usa extensão para poder ser usado em qualquer classe de Proprietário do Contexto.


fun Context.dismissKeyboard() {
    val imm by lazy { this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager }
    val windowHeightMethod = InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
    val height = windowHeightMethod.invoke(imm) as Int
    if (height > 0) {
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
    }
}

Mahmoud Mabrok
fonte
0

Usando o contexto da visualização, podemos obter o resultado desejado com os seguintes métodos de extensão no Kotlin:

/**
 * Get the [InputMethodManager] using some [Context].
 */
fun Context.getInputMethodManager(): InputMethodManager {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return getSystemService(InputMethodManager::class.java)
    }

    return getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
}

/**
 * Dismiss soft input (keyboard) from the window using a [View] context.
 */
fun View.dismissKeyboard() = context
        .getInputMethodManager()
        .hideSoftInputFromWindow(
                windowToken
                , 0
        )

Quando estes estiverem no lugar, basta ligar para:

editTextFoo.dismiss()
masterwok
fonte