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.
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
Ajoutez simplementAndroid:inputType="..."
à votre EditText. Ça va marcher!! :)
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_DONE
quand 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.
Utilisez Android:inputType="Yours"
puis
Android:lines="1"
Android:imeOptions="actionDone"
Après avoir essayé beaucoup de choses, voici ce qui a fonctionné pour moi:
Android:maxLines="1"
Android:inputType="text"
Android:imeOptions="actionDone"
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.