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


96

Eu usei alguns aplicativos onde quando eu preencho meu nome de usuário, vou até minha senha, se eu clicar em "Concluído" no teclado, o formulário de login é enviado automaticamente, sem eu ter que clicar no botão enviar. Como isso é feito?



Link rápido para os documentos: Especifique a ação do método de entrada
FirstOne

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.


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


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

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 .


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

1

adicione a seguinte linha no texto de edição

android:imeOptions="actionDone"

Boa codificação


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

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

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;
     }
 });
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.