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

JK
fuente

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?

Hariharan
fuente
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

flx
fuente
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() })
Francesco Donzello
fuente
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.

Desarrollador de Jitender
fuente
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; 
   } 
  });
Madhu Kumar
fuente
1

agregue la siguiente línea en edittext

android:imeOptions="actionDone"

Codificación feliz

Senthil JS
fuente
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
Rabia Aydoğdu
fuente
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)
}
bitvale
fuente
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;
        }
    });
Amit Gupta
fuente
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;
     }
 });
Divyesh Kevadiya
fuente