¿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?


Respuestas:



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

@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"
   />

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");

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

'


14

Utilizar este:

android:singleLine="true"

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);

7

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




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);

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.


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.


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


0

usa esto en tu vista

<EditText 
    ....
    ....
    android:imeOptions="actionDone" 
    android:id="@+id/edtName"
    />

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.