"Enviar" implícito después de presionar Listo en el teclado en el último EditText


96

He usado algunas aplicaciones en las que cuando completo mi nombre de usuario, luego voy a mi contraseña, si presiono "Listo" en el teclado, el formulario de inicio de sesión se envía automáticamente, sin que tenga que hacer clic en el botón Enviar. ¿Cómo se hace esto?



Enlace rápido a los documentos: Especifique la acción del método de entrada
FirstOne

Respuestas:


185

Prueba esto:

En su diseño, coloque / edite esto:

<EditText
    android:id="@+id/search_edit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="text"
    android:singleLine="true"
    android:imeOptions="actionDone" />

En su actividad ponga esto (por ejemplo, en onCreate):

 // your text box
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });

¿Dónde submit_btnestá su botón de enviar con su controlador onclick adjunto?


15
submit_btn.performClick();está quemando mis ojos. ¿Srsly? ¿Por qué no llamar al método de envío?
Laurent Meyer

28
@LaurentMeyer Simular la entrada del usuario suele ser mejor que llamar directamente a la lógica subyacente en estas situaciones. Por ejemplo, el botón de envío podría estar deshabilitado actualmente, por lo que performClick () no haría nada (según lo previsto), pero si llama al método de envío directamente, primero debe verificar que el botón no esté deshabilitado. También reproducirá el sonido de "clic" como si se
hubiera

3
@LaurentMeyer ¿A qué te refieres con UI sensible? Y 5 personas en los últimos 6 meses, seguro. Deles tiempo y la gente probablemente también estará de acuerdo conmigo. ;)
Extragorey

Consideremos que cambia la interfaz de usuario, que usa el botón para otra cosa. El código será un verdadero desastre y, lo que es peor, es necesario tener procedimientos de prueba muy extensos para detectar ese tipo de error. Peor aún es cuando comparte el componente UI con tales prácticas.
Laurent Meyer

1
TWIMC, usar imeActionLabelen mi EditText estaba deshabilitando todo este comportamiento. Cuidado
Alwin Kesler

25

Debe configurar las opciones de IME en su EditText.

<EditText
    android:id="@+id/some_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Whatever"
    android:inputType="text"
    android:imeOptions="actionDone" />

Luego, agregue OnEditorActionListenera la vista para escuchar la acción "realizada".

EditText editText = (EditText) findViewById(R.id.some_view);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // TODO do something
            handled = true;
        }
        return handled;
    }
});

Documento oficial de API: https://developer.android.com/guide/topics/ui/controls/text.html#ActionEvent


22

Solución simple y eficaz con Kotlin

Extender EditText:

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->

       if (actionId == EditorInfo.IME_ACTION_DONE) {
           func()
       }

       true

    }
}

Luego usa el nuevo método como este:

editText.onSubmit { submit() }

¿Dónde submit()hay algo como esto?

fun submit() {
    // call to api
}

Extensión más genérica

fun EditText.on(actionId: Int, func: () -> Unit) {
    setOnEditorActionListener { _, receivedActionId, _ ->

       if (actionId == receivedActionId) {
           func()
       }

        true
    }
}

Y luego puedes usarlo para escuchar tu evento:

email.on(EditorInfo.IME_ACTION_NEXT, { confirm() })

6

Asi es como se hace

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

No olvides agregar

<EditText android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:imeOptions="actionDone"/>

actionDone en su EditText.


2

En su archivo XML dentro de su etiqueta edittext agregue el siguiente fragmento

android:imeOptions="actionDone"

Luego, dentro de su clase de Java, escriba el siguiente código

editText.setOnEditorActionListener(new EditText.OnEditorActionListener() { 


@Override 
  public boolean onEditorAction(TextView v, int id, KeyEvent event) { 
   if (id == EditorInfo.IME_ACTION_DONE) { 
      //do your work here 
      return true;
    } 

        return false; 
   } 
  });

1

agregue la siguiente línea en edittext

android:imeOptions="actionDone"

Codificación feliz


1
etParola = (EditText) findViewById(R.id.etParola); 
 btnGiris = (Button) findViewById(R.id.btnGiris);
  etParola.setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    btnGiris.performClick();
                    return true;
                }
                return false;
            }
        });

 and;


layout xml etParola
android:imeOptions="actionDone" add

Esta es exactamente la misma respuesta que esta . Debería explicar un poco cómo cree que esto resuelve el problema de OP.
Adrian W.

1

Solo extiende esta respuesta

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            clearFocus() // if needed 
            hideKeyboard()
            func()
        }
        true
    }
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

0
<EditText
        android:id="@+id/signinscr_userName"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/userName"
        android:imeOptions="actionNext" />

    <EditText
        android:id="@+id/signinscr_password"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionDone"
        android:inputType="textPassword" />

en el archivo .java

EditText userNameField = (EditText) findViewById(R.id.signinscr_userName);
    EditText passwordField = (EditText) findViewById(R.id.signinscr_password);
    passwordField.setOnEditorActionListener(new OnEditorActionListener() {
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
            //Do your operation here.
            return false;
        }
    });

0
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
// which is u had set a imeoption
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });
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.