¿Cómo hago un botón 'Listo' de Android EditView y oculto el teclado cuando se hace clic en él?

115

Cuando el usuario hace clic en EditView, Android abre el teclado para que el usuario pueda escribir en el EditView.

El problema es que cuando el usuario termina de escribir, no hay forma de ocultar el teclado. El usuario debe presionar el botón Atrás para ocultar el teclado.

¿Hay alguna forma de mostrar un Donebotón en el teclado que oculte el teclado?

d-man
fuente

Respuestas:

139

Utilice TextView.setImeOptions y páselo actionDone. me gustatextView.setImeOptions(EditorInfo.IME_ACTION_DONE);

dmazzoni
fuente
8
textView.setImeOptions(EditorInfo.IME_ACTION_DONE);
sulai
14
Tuve que agregar textView.singleLine(true)para que esto funcione programáticamente.
Jacksonkr
pero esto está obsoleto desde Android 2.3
Sumit Kumar Saha
148

Primero debe establecer el android:imeOptionsatributo igual a actionDonepara su EditText de destino como se ve a continuación. Eso cambiará su botón 'RETORNO' en el teclado virtual de su EditText a un botón 'HECHO'.

<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
fuente
@Michael eliminó ese enlace. Gracias
Paresh Mayani
19
Tuve que agregar android:singleLine="true"para que esto funcione a través de xml
Jacksonkr
4
android: singleLine está en desuso. Utilice android: maxLines = "1".
FariborZ
Sí, @FariborZ singleLine ahora está en desuso.
Paresh Mayani
1
Nota importante: singleLine no es lo mismo que maxLines. Este concepto erróneo causa muchos problemas para todos, debemos tenerlo en cuenta en todas partes. stackoverflow.com/questions/30879471/…
milosmns
86

Incluya ambos imeOptions y singleLine :

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

En el archivo XML funciona bien. Pero esto también hará editTextque sigan escribiendo en una sola línea que es posible que no desee. Por lo tanto, agregar lo siguiente a su código se asegurará de que no termine escribiendo todo en una sola línea.

mainText.setHorizontallyScrolling(false);
mainText.setMaxLines("Maximum integer value that you want to provide");
Santosh Pillai
fuente
1
Gracias, la demostración fue el 12, el tiempo fue 11:58 y solucionaste mi problema en 11:59: p
shahzain ali
android: singleLine = "true" ha quedado obsoleto. Entonces usa, android: lines = "1"
Gowtham. R
20

Para conseguir el botón listo

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

y

android:inputType="text" en el xml

Para el manejo de hecho clic desde el 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
fuente
14

Utilizar este:

android:singleLine="true"
Frank Nguyen
fuente
Sí ... de lo contrario, ¿cómo se va a distinguir entre ir a la siguiente línea y cerrar el teclado?
jstewart379
Esto es lo que terminó funcionando para mí. Decidí equivocarme con tener actionDoneallí también, en caso de que algunos dispositivos reaccionen de manera diferente.
Jacksonkr
10

Utilice estas dos líneas para su EditText

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

o puede lograrlo programáticamente con esta línea.

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

Si la propiedad no cambia para el widget, puede ser mejor usarla como android:imeOptions="actionDone"en el xmlarchivo de diseño .

Tom
fuente
6

Utilizar:

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

Para el código:

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

ActionDone se usa cuando se hace clic en el botón siguiente en el teclado que el teclado de tiempo está oculto. Usar en Editar texto o AppcompatEdit

XML

1.1 Si usa 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 Si usa 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
fuente
5

Tengo que señalar que muchas personas pueden luchar para lograrlo sin conocer el problema.

Si desea que el kb se oculte al hacer clic Done, y establece android:imeOptions="actionDone"& android:maxLines="1" sin configurar su EditText inputType, NO funcionará como el valor predeterminado inputTypepara EditText no es "text"como mucha gente piensa.

Por lo tanto, la configuración sólo se inputTypele dará los resultados que usted desea que sea lo que esté configurando a gusto "text", "number"... etc.

Muhammed Refaat
fuente
2

En realidad, puede configurar texto personalizado para ese pequeño botón azul. En el archivo xml solo use

android:imeActionLabel="whatever"

en su EditText.

O en el uso del archivo java

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

Elijo arbitrariamente IME_ACTION_DONE como un ejemplo de lo que debería ir en el segundo parámetro para esta función. Puede encontrar una lista completa de estas acciones aquí .

Cabe señalar que esto no hará que aparezca texto en todos los teclados de todos los dispositivos. Algunos teclados no admiten texto en ese botón (por ejemplo, tecla rápida). Y algunos dispositivos tampoco lo admiten. Una buena regla es que, si ya ve texto en el botón, esto lo cambiará a lo que desee.

Zar E Ahmer
fuente
2

Solución de Kotlin

La forma directa de manejar el teclado ocultar + acción realizada en Kotlin es:

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

Extensión de Kotlin

Use esto para llamar edittext.onDone {/*action*/}a su código principal. Lo mantiene más legible y fácil de mantener

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

Extensiones de teclado adicionales

Si desea más formas de simplificar el trabajo con el teclado (mostrar, cerrar, enfocar): lea esta publicación

No olvide agregar estas opciones a su edittext Xml, si no están en el código

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

¿Necesitas inputType="textMultiLine"ayuda? Lea esta publicación y no agregue imeOptionsni inputTypeen XML

Gibolt
fuente
0

usa esto en tu vista

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

Si esta usando

android:imeOptions="actionDone" 

entonces debes usar

android:inputType="text"

entonces solo usted puede ver el botón Acción realizada en el teclado.

Aditya Patil
fuente
0

Si no desea ningún botón en absoluto (por ejemplo, está desarrollando una GUI para personas ciegas donde el toque no puede ser posicional y depende de los toques simples / dobles / largos):

text.setItemOptions(EditorInfo.IME_ACTION_NONE)

O en Kotlin:

text.imeOptions = EditorInfo.IME_ACTION_NONE
albaspazio
fuente