«Soumettre» implicite après avoir appuyé sur Terminé sur le clavier lors du dernier EditText


98

J'ai utilisé certaines applications où lorsque je remplis mon nom d'utilisateur, puis que j'accède à mon mot de passe, si je clique sur «Terminé» sur le clavier, le formulaire de connexion est automatiquement soumis, sans que je doive cliquer sur le bouton Soumettre. Comment cela se fait-il?



Lien rapide vers la documentation: Spécifiez l'action de la méthode d'entrée
FirstOne

Réponses:


187

Essaye ça:

Dans votre mise en page, mettez / modifiez ceci:

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

Dans votre activité, mettez ceci (par exemple dans 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;
     }
 });

Où se submit_btntrouve votre bouton d'envoi avec votre gestionnaire onclick attaché.


15
submit_btn.performClick();me brûle les yeux. Srsly? Pourquoi ne pas appeler la méthode submit?
Laurent Meyer

28
@LaurentMeyer Simuler l'entrée de l'utilisateur est généralement mieux que d'appeler directement la logique sous-jacente dans ces situations. Par exemple, le bouton d'envoi peut être désactivé actuellement, donc performClick () ne ferait rien (comme prévu), mais si vous appelez directement la méthode d'envoi, vous devez d'abord vérifier que le bouton n'a pas été désactivé. Il jouera également le son "clic" comme si le bouton avait été touché, etc.
Extragorey

3
@LaurentMeyer Qu'entendez-vous par UI sensible? Et 5 personnes au cours des 6 derniers mois, bien sûr. Donnez-leur du temps et les gens seront probablement d'accord avec moi aussi. ;)
Extragorey

Considérons que vous changez d'interface utilisateur, que vous utilisez le bouton pour autre chose. Le code sera un vrai gâchis et pire encore, vous aurez besoin de procédures de test très étendues pour détecter ce genre de bogue. Pire encore, lorsque vous partagez un composant d'interface utilisateur avec de telles pratiques.
Laurent Meyer

2
TWIMC, utiliser imeActionLabeldans mon EditText désactivait tout ce comportement. Attention
Alwin Kesler

25

Vous devez définir les options IME sur votre 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" />

Ajoutez ensuite un OnEditorActionListenerà la vue pour écouter l'action «terminé».

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

Document officiel de l'API: https://developer.android.com/guide/topics/ui/controls/text.html#ActionEvent


22

Solution simple et efficace avec Kotlin

Prolonger EditText:

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

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

       true

    }
}

Ensuite, utilisez la nouvelle méthode comme celle-ci:

editText.onSubmit { submit() }

submit()est quelque chose comme ça:

fun submit() {
    // call to api
}

Extension plus générique

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

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

        true
    }
}

Et puis vous pouvez l'utiliser pour écouter votre événement:

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

6

C'est comme ça que ça se fait

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'oubliez pas d'ajouter

<EditText android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:imeOptions="actionDone"/>

actionDone dans votre EditText.


2

Dans votre fichier XML à l'intérieur de votre balise edittext, ajoutez ci-dessous l'extrait

android:imeOptions="actionDone"

Ensuite, dans votre classe Java, écrivez le code ci-dessous

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

ajouter la ligne suivante dans edittext

android:imeOptions="actionDone"

Bon codage


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

C'est exactement la même réponse que celle-ci . Vous devriez expliquer un peu comment vous pensez que cela résout le problème d'OP.
Adrian W

1

Prolongez simplement cette réponse

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

dans le fichier .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;
     }
 });
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.