web-dev-qa-db-fra.com

Android imeOptions = "actionDone" ne fonctionne pas

J'essaie d'obtenir un écran de connexion pour une application Android et jusqu'à présent, c'est mon code:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">


    <LinearLayout
        Android:id="@+id/linearLayout1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:orientation="vertical">

        <EditText
            Android:id="@+id/username"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:hint="Username"
            Android:inputType="text"
            Android:singleLine="true"
            Android:imeOptions="actionNext">

            <requestFocus />
        </EditText>

        <EditText
            Android:id="@+id/password"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:hint="Password"
            Android:inputType="textPassword"
            Android:singleLine="true"
            Android:imeOptions="actionDone"  />

        <Button
            Android:id="@+id/buttonLaunchTriage"
            Android:layout_width="match_parent"
            Android:layout_height="0dp"
            Android:layout_weight="1"
            Android:text="@string/login" />
    </LinearLayout>



</RelativeLayout>

Lorsque j'essaie de l'exécuter, le clavier affiche les bonnes touches mais lorsque j'essaie d'appuyer sur Terminé après la saisie du mot de passe, rien ne se produit. Je l'utilise pour gérer la pression sur un bouton:

private void setupLoginButton() {
    Button launchButton = (Button) findViewById(R.id.buttonLaunchTriage);
    launchButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            EditText username = (EditText) findViewById(R.id.patient_start_userName_value);
            EditText password = (EditText) findViewById(R.id.patient_start_password_value);

            try {
                if(TriageApplicationMain.validateUser(username.getText().toString(),password.getText().toString(),getApplicationContext()))
                {
                Toast.makeText(StartActivity.this,
                        "Launching Triage Application", Toast.LENGTH_SHORT)
                        .show();
                startActivity(new Intent(StartActivity.this, MainActivity.class));
                }

                else
                     {
                    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                            StartActivity.this);


                        // set dialog message
                        alertDialogBuilder
                            .setMessage("Incorrect Credentials")
                            .setCancelable(false)
                            .setPositiveButton("OK",new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,int id) {
                                    // if this button is clicked, close
                                    // current activity
                                dialog.cancel();    
                                }
                              });


                            // create alert dialog
                            AlertDialog alertDialog = alertDialogBuilder.create();

                            // show it
                            alertDialog.show();

                    }
                }


            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });

}

Je sais que cela fait beaucoup de code, mais si quelqu'un pouvait m'aider ici, ce serait génial. Ceci est pour un projet d'école. 

PS: J'ai cherché pendant une bonne heure dans Google avant de publier ceci, donc ne critiquez pas de ne pas l'avoir fait. Si vous trouvez un lien utile, partagez-le. 

21
Mak

Vous devez définir OnEditorActionListener pour que EditText implémente l'action que vous souhaitez effectuer lorsque l'utilisateur clique sur le bouton "Terminé" du clavier.

Ainsi, vous devez écrire du code comme:

password.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // Do whatever you want here
            return true;
        }
        return false;
    }
});

Voir le didacticiel sur Site du développeur Android

35
Qianqian

Ajoutez simplementAndroid:inputType="..."à votre EditText. Ça va marcher!! :)

41
Oat Anirut

Qianqian est correct. Votre code n'écoute que l'événement click du bouton, pas l'événement EditorAction.

Je souhaite ajouter que certains fournisseurs de téléphones peuvent ne pas implémenter correctement l'action DONE. J'ai testé cela avec un Lenovo A889 par exemple, et ce téléphone n'envoie jamais EditorInfo.IME_ACTION_DONEquand vous appuyez sur Terminé, il envoie toujours EditorInfo.IME_ACTION_UNSPECIFIED et je finis donc avec quelque chose comme: 

myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event)
  {
    boolean handled=false;

    // Some phones disregard the IME setting option in the xml, instead
    // they send IME_ACTION_UNSPECIFIED so we need to catch that
    if(EditorInfo.IME_ACTION_DONE==actionId || EditorInfo.IME_ACTION_UNSPECIFIED==actionId)
    {
      // do things here

      handled=true;
    }

    return handled;
  }
});

Notez également le drapeau "manipulé" (Qianqian n'a pas expliqué cette partie). Il se peut que d'autres OnEditorActionListeners plus haut écoutent des événements d'un type différent. Si votre méthode retourne false, cela signifie que vous n'avez pas géré cet événement et qu'il sera transmis aux autres. Si vous renvoyez true, cela signifie que vous l’avez manipulé/utilisé et qu’il ne sera pas transmis à d’autres.

22
peedee

Utilisez Android:inputType="Yours" puis

Android:lines="1"
Android:imeOptions="actionDone"
7
influx

Après avoir essayé beaucoup de choses, voici ce qui a fonctionné pour moi:

    Android:maxLines="1"
    Android:inputType="text"
    Android:imeOptions="actionDone"
1
Jeremy Freeley

Vous devez définir OnEditorActionListener pour que EditText implémente l'action que vous souhaitez effectuer lorsque l'utilisateur clique sur le bouton "Terminé" du clavier.

1
Harsha Sharma

ajoutez simplement ceci à vos attributs:

Android:inputType="textPassword"

Doc: ici

0
Ali Alp