Android Utiliser le bouton Terminé sur le clavier pour cliquer sur le bouton


131

Ok dans mon application, j'ai un champ pour que l'utilisateur saisisse un nombre. J'ai le champ défini pour n'accepter que des nombres. Lorsque l'utilisateur clique sur le champ, il fait apparaître le clavier. Sur le clavier (sur ICS), il y a un bouton Terminé. J'aimerais que le bouton Terminé du clavier déclenche le bouton Soumettre que j'ai dans mon application. Mon code est le suivant.

package com.michaelpeerman.probability;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;

public class ProbabilityActivity extends Activity implements OnClickListener {

private Button submit;
ProgressDialog dialog;
int increment;
Thread background;
int heads = 0;
int tails = 0;

public void onCreate(Bundle paramBundle) {
    super.onCreate(paramBundle);
    setContentView(R.layout.main);
    submit = ((Button) findViewById(R.id.submit));
    submit.setOnClickListener(this);
}

public void onClick(View view) {
    increment = 1;
    dialog = new ProgressDialog(this);
    dialog.setCancelable(true);
    dialog.setMessage("Flipping Coin...");
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    dialog.setProgress(0);
    EditText max = (EditText) findViewById(R.id.number);
    int maximum = Integer.parseInt(max.getText().toString());
    dialog.setMax(maximum);
    dialog.show();
    dialog.setOnCancelListener(new OnCancelListener(){

          public void onCancel(DialogInterface dialog) {

              background.interrupt();
              TextView result = (TextView) findViewById(R.id.result);
                result.setText("heads : " + heads + "\ntails : " + tails);


          }});


    background = new Thread(new Runnable() {
        public void run() {
            heads=0;
            tails=0;
            for (int j = 0; !Thread.interrupted() && j < dialog.getMax(); j++) {
                int i = 1 + new Random().nextInt(2);
                if (i == 1)
                    heads++;
                if (i == 2)
                    tails++;
                progressHandler.sendMessage(progressHandler.obtainMessage());
            }
        }
    });
    background.start();
}

Handler progressHandler = new Handler() {
    public void handleMessage(Message msg) {

        dialog.incrementProgressBy(increment);
        if (dialog.getProgress() == dialog.getMax()) {
            dialog.dismiss();
            TextView result = (TextView) findViewById(R.id.result);
            result.setText("heads : " + heads + "\ntails : " + tails);


        }
    }

};

}


Cela fait référence à la mise à jour de la zone de texte.
mpeerman

Ce que je veux faire, c'est pour cela aussi déclencher un bouton que j'ai déjà. Je ne veux pas me débarrasser du bouton parce que certaines personnes peuvent utiliser des claviers qui n'ont pas de bouton Terminé.
mpeerman

Réponses:


313

Vous pouvez également utiliser celui-ci (définit un écouteur spécial à appeler lorsqu'une action est effectuée sur le EditText), cela fonctionne à la fois pour DONE et RETURN:

max.setOnEditorActionListener(new OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {
                Log.i(TAG,"Enter pressed");
            }    
            return false;
        }
    });

1
Comment puis-je le configurer pour déclencher le clic sur que j'ai déjà en cours d'exécution du bouton d'envoi public void onClick (Afficher la vue) {
mpeerman

3
Vous pouvez soit déplacer tout ce code dans une seule fonction, puis l'appeler, soit utiliser performClick ()
vladexologija

6
Cela ne fonctionnait pas pour moi lorsque j'appuyais sur un bouton DONE, le KeyEvent était toujours nul. Cependant, l'actionId était défini sur EditorInfo.IME_ACTION_DONE et j'ai pu l'utiliser à la place. (Ceci est dans Android 4.2.2 et ne correspond même pas à la documentation Android SDK pour le moment)
James

28

Vous pouvez essayer avec IME_ACTION_DONE.

Cette action exécute une opération «terminé» pour rien à saisir et l'IME sera fermé.

 Your_EditTextObj.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                  /* Write your logic here that will be executed when user taps next button */


                    handled = true;
                }
                return handled;
            }
        });

8
Celui-ci fonctionne parfaitement pour moi. Faites attention à ne pas renvoyer TRUE. Le clavier reste affiché. Si vous souhaitez masquer le clavier, renvoyez FALSE.
Matwosk

1
Fonctionne comme un bijou!
sam

16

Essaye ça:

max.setOnKeyListener(new OnKeyListener(){
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event){
        if(keyCode == event.KEYCODE_ENTER){
            //do what you want
        }
    }
});

Lorsque vous appuyez sur n'importe quel bouton, votre vue génère un événement onKey, et lorsque keyCode correspond au bouton droit, il fait ce que vous voulez
Roman Black

1
bouton doit avoir le focus
Jeffrey Blattman

8

Essayez ceci pour Xamarin.Android (Cross Platform)

edittext.EditorAction += (object sender, TextView.EditorActionEventArgs e) {
       if (e.ActionId.Equals (global::Android.Views.InputMethods.ImeAction.Done)) {
           //TODO Something
       }
};

7

Solution Kotlin

La méthode de base pour gérer l'action effectuée dans Kotlin est:

edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Call your code here
        true
    }
    false
}

Extension Kotlin

Utilisez ceci pour appeler edittext.onDone {/*action*/}votre code principal. Le rend plus lisible et maintenable

edittext.onDone { submitForm() }

fun EditText.onDone(callback: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}

N'oubliez pas d'ajouter ces options à votre edittext

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

Si vous avez besoin d' inputType="textMultiLine"aide, lisez cet article


4

J'ai copié le code suivant d'AndroidStudio lorsque vous créez un LoginActivity. J'utilise les attributs ime

Dans votre mise en page

<EditText android:id="@+id/unidades" android:layout_width="match_parent"
                    android:layout_height="wrap_content" android:hint="@string/prompt_unidades"
                    android:inputType="number" android:maxLines="1"
                    android:singleLine="true"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:enabled="true" android:focusable="true"
                    android:gravity="right"
                    android:imeActionId="@+id/cantidad"
                    android:imeActionLabel="@string/add"
                    android:imeOptions="actionUnspecified"/>

Dans votre activité

editTextUnidades.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == R.id.cantidad || actionId == EditorInfo.IME_NULL) {
                addDetalle(null);
                return true;
            }
            return false;
        }
    });

2

Vous pouvez implémenter sur l'écouteur clé:

public class ProbabilityActivity extends Activity implements OnClickListener, View.OnKeyListener {

Dans onCreate:

max.setOnKeyListener(this);

...

@Override
public boolean onKey(View v, int keyCode, KeyEvent event){
    if(keyCode == event.KEYCODE_ENTER){
        //call your button method here
    }
    return true;
}

1

si vous voulez attraper le bouton d'entrée du clavier pour faire votre travail que vous voulez faire à travers n'importe quel événement comme un clic sur le bouton, vous pouvez écrire le code simple ci-dessous pour cette vue de texte

Edittext ed= (EditText) findViewById(R.id.edit_text);

ed.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Do you job here which you want to done through event
    }
    return false;
}
});

1

Clavier Kotlin et numérique

Si vous utilisez le clavier numérique, vous devez fermer le clavier, ce sera comme:

editText.setOnEditorActionListener { v, actionId, event ->
  if (action == EditorInfo.IME_ACTION_DONE || action == EditorInfo.IME_ACTION_NEXT || action == EditorInfo.IME_ACTION_UNSPECIFIED) {
      //hide the keyboard
      val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
      imm.hideSoftInputFromWindow(windowToken, 0)
      //Take action
      editValue.clearFocus()
      return true
  } else {
      return false
  }
}

0

Utilisez cette classe dans votre mise en page:

public class ActionEditText extends EditText
{
    public ActionEditText(Context context)
    {
        super(context);
    }

    public ActionEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ActionEditText(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs)
    {
        InputConnection conn = super.onCreateInputConnection(outAttrs);
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        return conn;
    }

}

En xml:

<com.test.custom.ActionEditText
                android:id="@+id/postED"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:gravity="top|left"
                android:hint="@string/msg_type_message_here"
                android:imeOptions="actionSend"
                android:inputType="textMultiLine"
                android:maxLines="5"
                android:padding="5dip"
                android:scrollbarAlwaysDrawVerticalTrack="true"
                android:textColor="@color/white"
                android:textSize="20sp" />

0
max.setOnKeyListener(new OnKeyListener(){
  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event){
    if(keyCode == event.KEYCODE_ENTER){
        //do what you want
    }
  }
});

1
Commenter votre code améliore toujours la lisibilité d'une réponse ...
jAC

Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, pas seulement à la personne qui la pose maintenant! Veuillez modifier votre réponse pour ajouter une explication et donner une indication des limites et des hypothèses applicables. Cela ne fait pas de mal non plus de mentionner pourquoi cette réponse est plus appropriée que d'autres.
Dev-iL

0

Votre Last Edittext .setOnEditorActionListener appelle cette méthode api automatique

J'ai été appelé dans LoginActivity dans et_password

 et_Pass.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {

                    Log.i(TAG,"Enter pressed");
                    Log.i(Check Internet," and Connect To Server");

                }
                return false;
            }
        });

Travailler bien


0

Et ceci est une version Kotlin:

editText.setOnEditorActionListener { v, actionId, event ->
  if(actionId == EditorInfo.IME_ACTION_DONE){
      //Put your action there
      true
  } else {
      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.