“Enviar” implícito após clicar em Concluído no teclado no último EditText

Respostas:

185

Experimente isto:

Em seu layout, coloque / edite:

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

Em sua atividade coloque isto (por exemplo, em 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;
     }
 });

Onde submit_btnestá o botão de envio com o manipulador onclick anexado.

Hariharan
fonte
15
submit_btn.performClick();está queimando meus olhos. Srsly? Por que não chamar o método submit?
Laurent Meyer
28
@LaurentMeyer Simular a entrada do usuário geralmente é melhor do que chamar diretamente a lógica subjacente nessas situações. Por exemplo, o botão de envio pode estar desativado no momento, portanto, performClick () não faria nada (como pretendido), mas se você chamasse o método de envio diretamente, teria que verificar se o botão não foi desativado primeiro. Ele também reproduzirá o som de "clique" como se o botão tivesse sido tocado etc.
Extragorey
3
@LaurentMeyer O que você quer dizer com sensível à IU? E 5 pessoas nos últimos 6 meses, com certeza. Dê-lhes tempo e as pessoas provavelmente concordarão comigo também. ;)
Extragorey
Vamos considerar que você muda a IU, que usa o botão para outra coisa. O código será uma verdadeira bagunça e, pior ainda, você precisa ter procedimentos de teste muito extensos para detectar esse tipo de bug. Pior ainda é quando você compartilha o componente de IU com tais práticas.
Laurent Meyer
1
TWIMC, usar imeActionLabelno meu EditText estava desabilitando todo esse comportamento. Cuidado
Alwin Kesler
25

Você precisa definir as opções do IME no seu 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" />

Em seguida, adicione um OnEditorActionListenerà visualização para ouvir a ação "concluída".

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

flx
fonte
22

Solução simples e eficaz com Kotlin

Estender EditText:

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

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

       true

    }
}

Em seguida, use o novo método como este:

editText.onSubmit { submit() }

Onde submit()está algo assim:

fun submit() {
    // call to api
}

Extensão mais genérica

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

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

        true
    }
}

E então você pode usá-lo para ouvir seu evento:

email.on(EditorInfo.IME_ACTION_NEXT, { confirm() })
Francesco Donzello
fonte
6

É assim que se faz

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

Não se esqueça de adicionar

<EditText android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:imeOptions="actionDone"/>

actionDone em seu EditText .

Jitender Dev
fonte
2

Em seu arquivo XML dentro de sua tag edittext adicione o snippet abaixo

android:imeOptions="actionDone"

Então, dentro de sua classe Java, escreva o código abaixo

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
fonte
1

adicione a seguinte linha no texto de edição

android:imeOptions="actionDone"

Boa codificação

Senthil JS
fonte
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
fonte
Esta é exatamente a mesma resposta que esta . Você deve explicar um pouco como acha que isso resolve o problema de OP.
Adrian W
1

Basta estender esta resposta

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

no arquivo .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
fonte
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
fonte