Como faço para fazer um botão Android EditView 'Concluído' e ocultar o teclado quando clicado?

115

Quando o usuário clica em EditView, o Android abre o teclado para que o usuário possa escrever no EditView.

O problema é que, quando o usuário termina de escrever, não há como ocultar o teclado. O usuário deve pressionar o botão Voltar para ocultar o teclado.

Existe uma maneira de exibir um Donebotão no teclado que oculte o teclado?

d-man
fonte

Respostas:

139

Use TextView.setImeOptions e transmita actionDone. gostartextView.setImeOptions(EditorInfo.IME_ACTION_DONE);

dmazzoni
fonte
8
textView.setImeOptions(EditorInfo.IME_ACTION_DONE);
sulai
14
Eu tive que adicionar textView.singleLine(true)para fazer isso funcionar de forma programática.
Jacksonkr
mas está obsoleto desde o Android 2.3
Sumit Kumar Saha
148

Primeiro, você precisa definir o android:imeOptionsatributo igual a actionDonepara seu EditText de destino, conforme visto abaixo. Isso mudará o botão 'RETORNAR' no teclado virtual do EditText para um botão 'CONCLUÍDO'.

<EditText 
    android:id="@+id/edittext_done"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Enter some text"
    android:imeOptions="actionDone"
    />
Paresh Mayani
fonte
@Michael removeu esse link. Obrigado
Paresh Mayani,
19
Tive que adicionar android:singleLine="true"para fazer isso funcionar via xml
Jacksonkr
4
android: singleLine está obsoleto. Use android: maxLines = "1".
FariborZ
Sim @FariborZ singleLine está obsoleto agora.
Paresh Mayani
1
Observação importante: singleLine não é o mesmo que maxLines. Esse equívoco causa muitos problemas para todos, precisamos observar isso em todos os lugares. stackoverflow.com/questions/30879471/…
milosmns
86

Incluir ambos imeOptions e singleLine :

<EditText 
   android:id="@+id/edittext_done"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:imeOptions="actionDone"
   android:singleLine="true"
   />
Oded Breiner
fonte
35
android:imeActionLabel="Done" 
android:singleLine="true"

No arquivo XML funciona muito bem. Mas isso também fará com que o editTextcontinue digitando em uma única linha que você pode não querer. Portanto, adicionar o seguinte ao seu código garantirá que você não acabará digitando tudo em uma única linha.

mainText.setHorizontallyScrolling(false);
mainText.setMaxLines("Maximum integer value that you want to provide");
Santosh Pillai
fonte
1
Obrigado, a demonstração foi no dia 12, o tempo era 11h58 e você corrigiu meu problema em
11h59
android: singleLine = "true" tornou-se obsoleto. Portanto, use android: lines = "1"
Gowtham. R
20

Para obter o botão concluído

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

e

android:inputType="text" no xml

Para lidar com o clique feito no teclado

    editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event){
            if(actionId == EditorInfo.IME_ACTION_DONE){
                // Your action on done
                return true;
            }
            return false;
        }
    });

`

Shangeeth Sivan
fonte
14

Usa isto:

android:singleLine="true"
Frank Nguyen
fonte
Sim ... do contrário, como distinguiremos ir para a próxima linha de fechar o teclado?
jstewart379
Isso é o que acabou funcionando para mim. Decidi errar em ter actionDonelá também, apenas no caso de alguns dispositivos reagirem de forma diferente.
Jacksonkr
10

Use estas duas linhas para o seu EditText

android:imeActionLabel="Done"
android:singleLine="true"

ou você pode alcançá-lo programaticamente por esta linha.

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
NarenderNishad
fonte
7

Se a propriedade não mudar para o widget, pode ser melhor usar como android:imeOptions="actionDone"no xmlarquivo de layout .

Tom
fonte
6

Usar:

android:imeActionLabel="Done"
android:singleLine="true" 
Kiran Mahale
fonte
5

Para o código:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
Steven.Nguyen
fonte
5

ActionDone é usado quando clica no próximo botão no teclado quando o teclado está escondido. Use em Edit Text ou AppcompatEdit

XML

1.1 Se você usar o AppCompatEdittext

    <android.support.v7.widget.AppCompatEditText
    android:id="@+id/edittext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionDone"/>

1.2 Se você usar Edittext

    <EditText
    android:id="@+id/edittext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionDone"/>

JAVA

EditText edittext= (EditText) findViewById(R.id.edittext);
edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);
Raj
fonte
5

Devo salientar isso, pois muitas pessoas podem lutar contra isso sem saber qual é o problema.

Se você quiser que o kb se oculte ao clicar Done, e você definir android:imeOptions="actionDone"& android:maxLines="1" sem definir seu EditText, inputTypeele NÃO funcionará como o padrão inputTypepara o EditText, não é "text"como muitas pessoas pensam.

por isso, a criação única inputTypevai lhe dar os resultados que deseja tudo o que você está definindo-o como gostaria "text", "number"... etc.

Muhammed Refaat
fonte
2

Na verdade, você pode definir o texto personalizado para aquele pequeno botão azul. No arquivo xml apenas use

android:imeActionLabel="whatever"

no seu EditText.

Ou no arquivo java use

etEditText.setImeActionLabel("whatever", EditorInfo.IME_ACTION_DONE);

Eu escolho arbitrariamente IME_ACTION_DONE como um exemplo do que deve ir no segundo parâmetro para esta função. Uma lista completa dessas ações pode ser encontrada aqui .

Deve-se observar que isso não fará com que o texto apareça em todos os teclados em todos os dispositivos. Alguns teclados não oferecem suporte a texto nesse botão (por exemplo, swiftkey). E alguns dispositivos também não o suportam. Uma boa regra é, se você já vir texto no botão, isso o mudará para o que você quiser.

Zar E Ahmer
fonte
2

Solução Kotlin

A maneira direta de lidar com a ação ocultar teclado + concluída no Kotlin é:

// Set action
edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Hide Keyboard
        val inputMethodManager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
        true
    }
    false
}

Extensão Kotlin

Use para chamar edittext.onDone {/*action*/}em seu código principal. Mantém mais legibilidade e manutenção

edittext.onDone { edittext.hideKeyboard() }

fun View.hideKeyboard() {
    val inputMethodManager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

fun EditText.onDone(callback: () -> Unit) {
    // These lines optional if you don't want to set in Xml
    imeOptions = EditorInfo.IME_ACTION_DONE
    maxLines = 1
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}

Extensões de teclado adicionais

Se você quiser mais maneiras de simplificar o trabalho com o teclado (mostrar, fechar, focar): Leia esta postagem

Não se esqueça de adicionar essas opções ao seu Xml de texto de edição, se não no código

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

Precisa de inputType="textMultiLine"suporte? Leia esta postagem e não adicione imeOptionsou inputTypeem Xml

Gibolt
fonte
0

use isso em sua visão

<EditText 
    ....
    ....
    android:imeOptions="actionDone" 
    android:id="@+id/edtName"
    />
Marium Jawed
fonte
0

Se você estiver usando

android:imeOptions="actionDone" 

então você deve usar

android:inputType="text"

então, só você pode ver o botão Ação concluída no teclado.

Aditya Patil
fonte
0

Se você não quiser nenhum botão (por exemplo, você está desenvolvendo uma GUI para cegos onde o toque não pode ser posicional e você depende de toques simples / duplos / longos):

text.setItemOptions(EditorInfo.IME_ACTION_NONE)

Ou em Kotlin:

text.imeOptions = EditorInfo.IME_ACTION_NONE
Albaspazio
fonte