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

JK
la source
Essayez cette réponse de lien ... insérez les données dans la base de données lorsque vous cliquez sur le bouton
Terminé du clavier
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é.

Hariharan
la source
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

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

Jitender Dev
la source
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; 
   } 
  });
Madhu Kumar
la source
1

ajouter la ligne suivante dans edittext

android:imeOptions="actionDone"

Bon codage

Senthil JS
la source
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
la source
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)
}
bitvale
la source
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;
        }
    });
Amit Gupta
la source
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
la source