"Invia" implicito dopo aver premuto Fine sulla tastiera nell'ultimo EditText


96

Ho utilizzato alcune app in cui quando inserisco il mio nome utente, quindi vado alla mia password, se premo "Fine" sulla tastiera, il modulo di accesso viene inviato automaticamente, senza che io debba fare clic sul pulsante di invio. Come si fa?


Prova questa risposta al collegamento ... inserisci i dati nel database quando si fa clic sul pulsante
Fine

Collegamento rapido ai documenti: specificare l'azione del metodo di input
FirstOne

Risposte:


185

Prova questo:

Nel tuo layout inserisci / modifica questo:

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

Nella tua attività inserisci questo (ad esempio in 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;
     }
 });

Dov'è il submit_btntuo pulsante di invio con il tuo gestore onclick allegato.


15
submit_btn.performClick();mi sta bruciando gli occhi. Srsly? Perché non chiamare il metodo di invio?
Laurent Meyer

28
@LaurentMeyer Simulare l'input dell'utente in genere è meglio che chiamare direttamente la logica sottostante in queste situazioni. Ad esempio, il pulsante di invio potrebbe essere attualmente disabilitato, quindi performClick () non farebbe nulla (come previsto), ma se chiamassi direttamente il metodo di invio, dovresti prima controllare che il pulsante non sia stato disabilitato.
Suonerà

3
@LaurentMeyer Cosa intendi per sensibile all'interfaccia utente? E 5 persone negli ultimi 6 mesi, certo. Dai loro tempo e probabilmente anche le persone saranno d'accordo con me. ;)
Extragorey

Considera che cambi l'interfaccia utente, che usi il pulsante per qualcos'altro. Il codice sarà un vero casino e, peggio ancora, è necessario disporre di procedure di test davvero estese per rilevare quel tipo di bug. Ancora peggio è quando condividi il componente dell'interfaccia utente con tali pratiche.
Laurent Meyer

1
TWIMC, utilizzando imeActionLabelnel mio EditText, disabilitava tutto questo comportamento. Attenzione
Alwin Kesler

25

Devi impostare le Opzioni IME sul tuo 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" />

Quindi aggiungi un OnEditorActionListeneralla visualizzazione per ascoltare l'azione "completata".

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 API ufficiale: https://developer.android.com/guide/topics/ui/controls/text.html#ActionEvent


22

Soluzione semplice ed efficace con Kotlin

Estendi EditText:

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

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

       true

    }
}

Quindi usa il nuovo metodo in questo modo:

editText.onSubmit { submit() }

Dov'è submit()qualcosa del genere:

fun submit() {
    // call to api
}

Estensione più generica

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

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

        true
    }
}

E poi puoi usarlo per ascoltare il tuo evento:

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

6

Ecco come si fa

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

Non dimenticare di aggiungere

<EditText android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:imeOptions="actionDone"/>

actionDone nel tuo EditText.


2

Nel tuo file XML all'interno del tag edittext aggiungi lo snippet di seguito

android:imeOptions="actionDone"

Quindi all'interno della tua classe Java, scrivi il codice seguente

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

aggiungi la seguente riga in edittext

android:imeOptions="actionDone"

Buona codifica


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

Questa è esattamente la stessa risposta di questa . Dovresti spiegare un po 'come pensi che questo risolva il problema di OP.
Adrian W

1

Estendi questa risposta

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

nel file .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;
     }
 });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.