Android - Gérez «Entrer» dans un EditText


459

Je me demande s'il existe un moyen de gérer la pression de l'utilisateur Enterlors de la saisie d'un EditText, quelque chose comme l'événement HTML onSubmit.

Vous vous demandez également s'il existe un moyen de manipuler le clavier virtuel de telle sorte que le bouton "Terminé" soit étiqueté autre chose (par exemple "Go") et effectue une certaine action lorsque vous cliquez dessus (à nouveau, comme onSubmit).


1
Kotlin & Extensions: jetez un œil ici: stackoverflow.com/a/48810268/1912924
Francesco Donzello

Réponses:


374

Je me demande s'il existe un moyen de gérer la pression de l'utilisateur Enterlors de la saisie d'un EditText, quelque chose comme l'événement HTML onSubmit.

Oui.

Vous vous demandez également s'il existe un moyen de manipuler le clavier virtuel de telle sorte que le bouton "Terminé" soit étiqueté autre chose (par exemple "Go") et effectue une certaine action lorsque vous cliquez dessus (à nouveau, comme onSubmit).

Oui aussi.

Vous voudrez regarder les attributs android:imeActionIdet android:imeOptions, ainsi que la setOnEditorActionListener()méthode, tout cela TextView.

Pour changer le texte du bouton "Terminé" en une chaîne personnalisée, utilisez:

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

26
(PS EditText étend TextView, donc pourquoi les propriétés que vous devriez regarder sont sur TextView - quand j'ai lu cette dernière phrase pour la première fois, j'ai fait une double prise :))
Ricket

15
Comme une note. Tous les claviers ne prennent pas en charge l'attribut standard android: imeOptions. Ce qui est vraiment décevant. Par exemple, IME_ACTION_DONE est défini comme 6, où le clavier par défaut HTC (sur les téléphones comme Incredible, Evo 4G), la touche de retour est définie comme 0.
fernferret

13
De plus, si vous utilisez imeOptions, assurez-vous également d'utiliser inputType = "text" ou un autre équivalent. Pour que le clavier vous écoute! Nexus1
Blundell

6
"Oui" - Seriez-vous plus descriptif que cela? Il vous demandera probablement comment implémenter la solution.
Al Wang

4
@AlWang: Premièrement, votre sujet de préoccupation est couvert dans la réponse (voir commencer par "Vous voudrez ..."). Deuxièmement, cette réponse date d' il y a six ans , et on pourrait donc supposer que le problème du PO a été résolu. Après tout, le PO a accepté la réponse.
CommonsWare du

267
final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // If the event is a key-down event on the "enter" button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER)) {
          // Perform action on key press
          Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
          return true;
        }
        return false;
    }
});

1
Pour une raison quelconque, lorsque je clique enterdans mon texte d'édition, le texte d'édition entier se déplace vers le bas ... Comment résoudre ce problème?
Ruchir Baronia

1
@RuchirBaronia Ajoutez android: maxLines = "1" à votre EditText. Votre EditText ne "descend pas", mais insère plutôt un saut de ligne dans le texte saisi. La définition de maxLines sur 1 empêche l'insertion du saut de ligne.
lustig

3
Cette solution ne fonctionne que pour les claviers matériels, PAS pour le clavier virtuel / virtuel. Si vous vous y fiez, votre application sera interrompue pour les utilisateurs sans clavier.
user3562927

12
Aucune infraction à CommonsWare, mais sa réponse RTFM était beaucoup moins utile que cet exemple simple montrant exactement comment le faire. Je vous remercie!
AutonomousApps

1
@AutonomousApps, je vois souvent des réponses CommonsWare. Il a eu la chance de répondre depuis 2009, lorsque Android a commencé. Souvent "oui", "non", "impossible" et ainsi de suite, généralement sans code. Souvent, ses réponses sont dépassées maintenant, alors j'essaie de ne pas suivre ses recommandations.
CoolMind

215

Voici ce que vous faites. Il est également masqué dans l'exemple de code du développeur Android «Bluetooth Chat». Remplacez les parties en gras qui disent "exemple" par vos propres variables et méthodes.

Tout d'abord, importez ce dont vous avez besoin dans l'activité principale où vous souhaitez que le bouton de retour fasse quelque chose de spécial:

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

Maintenant, créez une variable de type TextView.OnEditorActionListener pour votre clé de retour (ici j'utilise exampleListener );

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

Ensuite, vous devez dire à l'auditeur deux choses à faire lorsque vous appuyez sur le bouton de retour. Il doit savoir de quel EditText nous parlons (ici j'utilise exampleView ), puis il doit savoir quoi faire lorsque la touche Entrée est enfoncée (ici, example_confirm () ). S'il s'agit du dernier ou du seul EditText de votre activité, il doit faire la même chose que la méthode onClick pour votre bouton Soumettre (ou OK, Confirmer, Envoyer, Enregistrer, etc.).

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

Enfin, définissez l'écouteur (très probablement dans votre méthode onCreate);

exampleView.setOnEditorActionListener(exampleListener);

20
Bien, j'ai utilisé EditorInfo.IME_ACTION_SEND et j'ai android: imeOptions = "actionSend" sur le XML.
Bani

la recherche de EditorInfo.IME_ACTION_SEND n'a eu aucun effet pour moi (émulateur), donc en tant que déclencheur infaillible, j'ai également recherché KeyEvent.KEYCODE_ENTER. Voir ici: stackoverflow.com/questions/2004344/…
Someone Somewhere

4
Il est généralement préférable d'effectuer des actions sur KeyEvent.ACTION_UP. Pour que cela fonctionne, vous devez d'abord consommer l' ACTION_DOWNévénement: if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }. Ensuite, vous pouvez vérifier l' ACTION_UPévénement et effectuer l'action (similaire à la réponse ci-dessus). Si vous ne consommez pas l' ACTION_DOWNévénement, vous ne onEditorActionserez pas appelé ACTION_UP.
ashughes

2
C'est ce qui a fonctionné pour moi: if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}- n'a pu obtenir aucune des autres approches de travail
Jonathan Ellis

38

Les claviers matériels génèrent toujours des événements d'entrée, mais les claviers logiciels renvoient des ID d'action et des valeurs NULL différents dans singleLine EditTexts. Ce code répond chaque fois que l'utilisateur appuie sur Entrée dans un EditText auquel cet écouteur a été défini, quel que soit EditText ou le type de clavier.

import android.view.inputmethod.EditorInfo;
import android.view.KeyEvent;
import android.widget.TextView.OnEditorActionListener;

listener=new TextView.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (event==null) {
      if (actionId==EditorInfo.IME_ACTION_DONE);
      // Capture soft enters in a singleLine EditText that is the last EditText.
      else if (actionId==EditorInfo.IME_ACTION_NEXT);
      // Capture soft enters in other singleLine EditTexts
      else return false;  // Let system handle all other null KeyEvents
    }
    else if (actionId==EditorInfo.IME_NULL) { 
    // Capture most soft enters in multi-line EditTexts and all hard enters.
    // They supply a zero actionId and a valid KeyEvent rather than
    // a non-zero actionId and a null event like the previous cases.
      if (event.getAction()==KeyEvent.ACTION_DOWN); 
      // We capture the event when key is first pressed.
      else  return true;   // We consume the event when the key is released.  
    }
    else  return false; 
    // We let the system handle it when the listener
    // is triggered by something that wasn't an enter.


    // Code from this point on will execute whenever the user
    // presses enter in an attached view, regardless of position, 
    // keyboard, or singleLine status.

    if (view==multiLineEditText)  multiLineEditText.setText("You pressed enter");
    if (view==singleLineEditText)  singleLineEditText.setText("You pressed next");
    if (view==lastSingleLineEditText)  lastSingleLineEditText.setText("You pressed done");
    return true;   // Consume the event
  }
};

L'apparence par défaut de la touche Entrée dans singleLine = false donne une flèche courbée entrer le clavier. Lorsque singleLine = true dans le dernier EditText, la clé indique DONE, et sur les EditTexts avant elle, elle indique NEXT. Par défaut, ce comportement est cohérent sur tous les émulateurs vanilla, android et google. L'attribut scrollHorizontal ne fait aucune différence. Le test nul est important car la réponse des téléphones aux entrées logicielles est laissée au fabricant et même dans les émulateurs, les émulateurs vanille niveau 16 répondent aux longues entrées douces en plusieurs lignes et scrollHorizontal EditTexts avec un actionId de NEXT et un null pour l'événement.


Lorsque j'ai mis à niveau Java, ma chaîne d'outils Android s'est cassée. C'était en 32 bits. J'ai réinstallé tout en 64 bits et découvert qu'il existe de nombreuses autres versions d'émulateur public disponibles maintenant. Je dois admettre que je sais seulement que le comportement de EditorActionListener est cohérent dans les émulateurs que j'ai testés.
earlcasper

Lorsque j'ai posté cela sur mon blog, quelqu'un a commenté que pour que cela fonctionne sur eclipse, vous devez changer l'action par défaut ime, en ajoutant android: imeOptions = ”actionGo”.
earlcasper

Oups, j'ai mal lu le commentaire sur mon blog. Pour le faire fonctionner sur eclipse, vous devez changer l'action ime par défaut, en ajoutant android: imeOptions = ”actionGo”. au «EditText» dans le xml de mise en page.
earlcasper

Après réflexion, mon dernier commentaire fait référence à la fois à Ant et à Eclipse
earlcasper

27

Cette page décrit exactement comment procéder.

https://developer.android.com/training/keyboard-input/style.html

Définissez l' android: imeOptions, puis il vous suffit de vérifier l' actionId dans onEditorAction. Donc, si vous définissez imeOptions sur 'actionDone', vous vérifierez 'actionId == EditorInfo.IME_ACTION_DONE' dans onEditorAction. Assurez-vous également de définir l'androïde: inputType.

Voici le EditText de l'exemple lié ci-dessus:

<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

Vous pouvez également définir cela par programmation à l'aide de la fonction setImeOptions (int) . Voici le OnEditorActionListener de l'exemple lié ci-dessus:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

21

Je sais que cela a un an, mais je viens de découvrir que cela fonctionne parfaitement pour un EditText.

EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);

Il empêche tout sauf le texte et l'espace. Je ne pouvais pas tabuler, "retourner" ("\ n") ou quoi que ce soit.


A travaillé pour moi, avec l'ajout du IME_ACTION_DONE
htafoya

1
Fonctionne parfaitement bien si vous souhaitez désactiver la touche "Entrée".
deeJ

16

Tout comme un addendum à la réponse du Tchad (qui a fonctionné presque parfaitement pour moi), j'ai trouvé que je devais ajouter une vérification sur le type d'action KeyEvent pour empêcher mon code de s'exécuter deux fois (une fois à la clé et une fois à la touche enfoncée) un événement).

if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)
{
    // your code here
}

Voir http://developer.android.com/reference/android/view/KeyEvent.html pour des informations sur la répétition des événements d'action (en maintenant la touche Entrée) etc.


16

J'avais un objectif similaire. Je voulais résoudre en appuyant sur la touche "Entrée" du clavier (que je voulais personnaliser) dans un AutoCompleteTextView qui étend TextView. J'ai essayé différentes solutions d'en haut et elles semblaient fonctionner. MAIS j'ai rencontré des problèmes lorsque j'ai changé le type d'entrée sur mon appareil (Nexus 4 avec AOKP ROM) de SwiftKey 3 (où cela fonctionnait parfaitement) au clavier Android standard (où au lieu de gérer mon code de l'auditeur, une nouvelle ligne était entré après avoir appuyé sur la touche "Entrée". Il m'a fallu un certain temps pour gérer ce problème, mais je ne sais pas si cela fonctionnera en toutes circonstances, quel que soit le type d'entrée que vous utilisez.

Voici donc ma solution:

Définissez l'attribut de type d'entrée de TextView dans le xml sur "texte":

android:inputType="text"

Personnalisez le libellé de la touche "Entrée" du clavier:

myTextView.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

Définissez un OnEditorActionListener sur TextView:

myTextView.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event)
    {
    boolean handled = false;
    if (event.getAction() == KeyEvent.KEYCODE_ENTER)
    {
        // Handle pressing "Enter" key here

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

J'espère que cela peut aider les autres à éviter les problèmes que j'ai eus, car ils m'ont presque rendu fou.


Malheureusement, cela ne fonctionne pas avec la nouvelle version 4 de SwiftKey. Et ça me rend fou encore ...: - /
kaolick

3
votre SI est incorrect. use: 'event.getKeyCode () == KeyEvent.KEYCODE_ENTER'
Loda

Parfait pour moi. N'oubliez pas non plus d'insérer à nouveau setImeActionLabel dans l'instruction IF, sinon le texte personnalisé disparaît après la première pression.
Steve Rogers

Son IF est correct, car il définit son actionId sur KeyEvent.KEYCODE_ENTER ci-dessus :-D, mais oui, tout le monde voudra probablement utiliser event.getKeyCode () == KeyEvent.KEYCODE_ENTER
Ray Hulha

15

Dans votre xml, ajoutez l'attribut imeOptions à editText

<EditText
    android:id="@+id/edittext_additem"
    ...
    android:imeOptions="actionDone"
    />

Ensuite, dans votre code Java, ajoutez le OnEditorActionListener au même EditText

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

Voici l'explication: imeOptions = actionDone affectera "actionDone" à EnterKey. La touche EnterKey du clavier passera de "Enter" à "Done". Ainsi, lorsque la touche Entrée est enfoncée, elle déclenchera cette action et vous la manipulerez donc.


9

Vous pouvez aussi le faire ..

editText.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getKeyCode() ==       KeyEvent.KEYCODE_ENTER) 
                {
                    Log.i("event", "captured");

                    return false;
                } 

            return false;
        }
    });

Pour une raison quelconque, lorsque je clique enterdans mon texte d'édition, le texte d'édition entier se déplace vers le bas ... Comment résoudre ce problème?
Ruchir Baronia

Je pense que vous voulez apprendre stackoverflow.com/questions/10978038/… sinon montrez-moi votre xml
Zar E Ahmer

6
     password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                submit.performClick();
                return true;
            }
            return false;
        }
    });

Fonctionne très bien pour moi
En plus masquer le clavier


5

Tout d'abord, vous devez définir EditText écouter la touche appuyez sur

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    // Set the EditText listens to key press
    EditText edittextproductnumber = (EditText) findViewById(R.id.editTextproductnumber);
    edittextproductnumber.setOnKeyListener(this);

}

Deuxièmement, définissez l'événement lorsque vous appuyez sur la touche, par exemple, événement pour définir le texte de TextView:

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

 // Listen to "Enter" key press
 if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
 {
     TextView textviewmessage = (TextView) findViewById(R.id.textViewmessage);
     textviewmessage.setText("You hit 'Enter' key");
     return true;
 }

return false;   

}

Et enfin, n'oubliez pas d'importer EditText, TextView, OnKeyListener, KeyEvent en haut:

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;

5

fonctionne parfaitement

public class MainActivity extends AppCompatActivity {  
TextView t;
Button b;
EditText e;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    b = (Button) findViewById(R.id.b);
    e = (EditText) findViewById(R.id.e);

    e.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            if (before == 0 && count == 1 && s.charAt(start) == '\n') {

                b.performClick();
                e.getText().replace(start, start + 1, ""); //remove the <enter>
            }

        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void afterTextChanged(Editable s) {}
    });

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            b.setText("ok");

        }
    });
}

}

fonctionne parfaitement


5
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId != 0 || event.getAction() == KeyEvent.ACTION_DOWN) {
                // Action
                return true;
            } else {
                return false;
            }
        }
    });

Xml

<EditText
        android:id="@+id/editText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionGo|flagNoFullscreen"
        android:inputType="textPassword"
        android:maxLines="1" />

4

Cela devrait fonctionner

input.addTextChangedListener(new TextWatcher() {

           @Override
           public void afterTextChanged(Editable s) {}

           @Override    
           public void beforeTextChanged(CharSequence s, int start,
             int count, int after) {
           }

           @Override    
           public void onTextChanged(CharSequence s, int start,
             int before, int count) {
               if( -1 != input.getText().toString().indexOf( "\n" ) ){
                   input.setText("Enter was pressed!");
                    }
           }
          });

4

Tapez ce code dans votre éditeur afin qu'il puisse importer les modules nécessaires.

 query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if(actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                        || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {

                // Put your function here ---!

                return true;

            }
            return false;
        }
    });

query = Nom du champ EditText, et ajoutez également ceci -> (android: imeOptions = "actionSearch") en xml de EditText.
Sanjit Prasad

3

Cela fonctionne très bien sur les téléphones LG Android. Il empêche les ENTERautres caractères spéciaux d'être interprétés comme des caractères normaux. Nextou le Donebouton apparaît automatiquement et ENTERfonctionne comme prévu.

edit.setInputType(InputType.TYPE_CLASS_TEXT);

C'est la SEULE chose qui a fonctionné pour moi. J'ai un Motorola Moto X 2 et normalement il a une touche "Retour" avec la flèche et tout. Cela l'a changé en une coche et j'ai finalement réussi à faire fonctionner l'auditeur avec cela. (Avant, il venait de créer une nouvelle ligne). Donc, si quelqu'un d'autre a ce problème ...
cola mystique

2

Voici une fonction statique simple que vous pouvez lancer dans votre classe Utilsou Keyboardsqui exécutera du code lorsque l'utilisateur appuiera sur la touche retour d'un clavier matériel ou logiciel. C'est une version modifiée de l'excellente réponse de @ earlcasper

 /**
 * Return a TextView.OnEditorActionListener that will execute code when an enter is pressed on
 * the keyboard.<br>
 * <code>
 *     myTextView.setOnEditorActionListener(Keyboards.onEnterEditorActionListener(new Runnable()->{
 *         Toast.makeText(context,"Enter Pressed",Toast.LENGTH_SHORT).show();
 *     }));
 * </code>
 * @param doOnEnter A Runnable for what to do when the user hits enter
 * @return the TextView.OnEditorActionListener
 */
public static TextView.OnEditorActionListener onEnterEditorActionListener(final Runnable doOnEnter){
    return (__, actionId, event) -> {
        if (event==null) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // Capture soft enters in a singleLine EditText that is the last EditText.
                doOnEnter.run();
                return true;
            } else if (actionId==EditorInfo.IME_ACTION_NEXT) {
                // Capture soft enters in other singleLine EditTexts
                doOnEnter.run();
                return true;
            } else {
                return false;  // Let system handle all other null KeyEvents
            }
        } else if (actionId==EditorInfo.IME_NULL) {
            // Capture most soft enters in multi-line EditTexts and all hard enters.
            // They supply a zero actionId and a valid KeyEvent rather than
            // a non-zero actionId and a null event like the previous cases.
            if (event.getAction()==KeyEvent.ACTION_DOWN) {
                // We capture the event when key is first pressed.
                return true;
            } else {
                doOnEnter.run();
                return true;   // We consume the event when the key is released.
            }
        } else {
            // We let the system handle it when the listener
            // is triggered by something that wasn't an enter.
            return false;
        }
    };
}

Notez que cela utilise une expression lambda qui nécessite Java 1.8, mais il est assez facile de la convertir pour ne pas utiliser de lambda. Cependant, le problème que j'ai vu avec ce type de solutions est que le clavier virtuel ne se cache pas automatiquement et si en mode plein écran (petit appareil en orientation paysage), le mode plein écran ne se désactive pas après que l'utilisateur a
appuyé

2

InputType sur le champ de texte doit être texten ordre pour que ce que CommonsWare dit fonctionner. Je viens d'essayer tout cela, aucun type d'entrée avant le procès et rien n'a fonctionné, Enter a continué à s'inscrire en tant que soft enter. Après inputType = text, tout, y compris le setImeLabel, a fonctionné.

Exemple : android:inputType="text"


2
   final EditText edittext = (EditText) findViewById(R.id.edittext);
    edittext.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
                // Perform action on key press
                Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

1

Une manière fiable de répondre à un <enter> dans un EditText est avec un TextWatcher , un LocalBroadcastManager et un BroadcastReceiver . Vous devez ajouter la bibliothèque de support v4 pour utiliser LocalBroadcastManager. J'utilise le tutoriel sur vogella.com : 7.3 "Événements de diffusion locale avec LocalBroadcastManager" en raison de son exemple de code concis complet. Dans onTextChanged avant se trouve l'index de la fin de la modification avant la modification >; moins le début. Lorsque dans le TextWatcher, le thread d'interface utilisateur est occupé à mettre à jour modifiable de editText, nous envoyons donc une intention de réveiller le BroadcastReceiver lorsque le thread d'interface utilisateur a terminé la mise à jour de editText.

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.Editable;
//in onCreate:
editText.addTextChangedListener(new TextWatcher() {
  public void onTextChanged
  (CharSequence s, int start, int before, int count) {
    //check if exactly one char was added and it was an <enter>
    if (before==0 && count==1 && s.charAt(start)=='\n') {
    Intent intent=new Intent("enter")
    Integer startInteger=new Integer(start);
    intent.putExtra("Start", startInteger.toString()); // Add data
    mySendBroadcast(intent);
//in the BroadcastReceiver's onReceive:
int start=Integer.parseInt(intent.getStringExtra("Start"));
editText.getText().replace(start, start+1,""); //remove the <enter>
//respond to the <enter> here

Si vous utilisez l'un des types d'entrée de texte * (par exemple android:inputType="textCapSentences"), les retours chariot sont filtrés hors de l'entrée afin que onTextChanged () ne soit pas appelé lorsque l'utilisateur appuie sur la touche Entrée.
jk7

1

Cette question n'a pas encore reçu de réponse avec Butterknife

LAYOUT XML

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/some_input_hint">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/textinput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionSend"
            android:inputType="text|textCapSentences|textAutoComplete|textAutoCorrect"/>
    </android.support.design.widget.TextInputLayout>

APP JAVA

@OnEditorAction(R.id.textinput)
boolean onEditorAction(int actionId, KeyEvent key){
    boolean handled = false;
    if (actionId == EditorInfo.IME_ACTION_SEND || (key.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
        //do whatever you want
        handled = true;
    }
    return handled;
}

TextInputLayout et Butterknife: GAGNEZ!
Javi

1

En utilisant Kotlin, j'ai créé une fonction qui gère toutes sortes d'actions de type "terminé" pour EditText, y compris le clavier, et il est possible de le modifier et de gérer d'autres touches comme vous le souhaitez également:

private val DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(EditorInfo.IME_ACTION_SEND, EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_DONE)
private val DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_NUMPAD_ENTER)

fun EditText.setOnDoneListener(function: () -> Unit, onKeyListener: OnKeyListener? = null, onEditorActionListener: TextView.OnEditorActionListener? = null,
                               actionsToHandle: Collection<Int> = DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT,
                               keysToHandle: Collection<Int> = DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT) {
    setOnEditorActionListener { v, actionId, event ->
        if (onEditorActionListener?.onEditorAction(v, actionId, event) == true)
            return@setOnEditorActionListener true
        if (actionsToHandle.contains(actionId)) {
            function.invoke()
            return@setOnEditorActionListener true
        }
        return@setOnEditorActionListener false
    }
    setOnKeyListener { v, keyCode, event ->
        if (onKeyListener?.onKey(v, keyCode, event) == true)
            return@setOnKeyListener true
        if (event.action == KeyEvent.ACTION_DOWN && keysToHandle.contains(keyCode)) {
            function.invoke()
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }
}

Donc, exemple d'utilisation:

        editText.setOnDoneListener({
            //do something
        })

Quant au changement d'étiquette, je pense que cela dépend de l'application clavier, et qu'il ne change généralement que sur le paysage, comme écrit ici . Quoi qu'il en soit, un exemple d'utilisation pour cela:

        editText.imeOptions = EditorInfo.IME_ACTION_DONE
        editText.setImeActionLabel("ASD", editText.imeOptions)

Ou, si vous voulez en XML:

    <EditText
        android:id="@+id/editText" android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:imeActionLabel="ZZZ" android:imeOptions="actionDone" />

Et le résultat (montré en paysage):

entrez la description de l'image ici


0

Ajoutez ces dépendances, et cela devrait fonctionner:

import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;

0

Cela vous donnera une fonction appelable lorsque l'utilisateur appuie sur la touche de retour.

fun EditText.setLineBreakListener(onLineBreak: () -> Unit) {
    val lineBreak = "\n"
    doOnTextChanged { text, _, _, _ ->
        val currentText = text.toString()

        // Check if text contains a line break
        if (currentText.contains(lineBreak)) {

            // Uncommenting the lines below will remove the line break from the string
            // and set the cursor back to the end of the line

            // val cleanedString = currentText.replace(lineBreak, "")
            // setText(cleanedString)
            // setSelection(cleanedString.length)

            onLineBreak()
        }
    }
}

Usage

editText.setLineBreakListener {
    doSomething()
}
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.