359 votes

Dialogue de texte d'entrée Android

Lorsqu'un utilisateur clique sur un Bouton dans mon application (qui est affichée dans un SurfaceView), j'aimerais qu'une boîte de dialogue texte Dialog apparaisse et j'aimerais stocker le résultat dans une String. Je voudrais que la boîte de dialogue texte Dialog se superpose à l'écran actuel. Comment puis-je faire cela ?

679voto

Aaron Points 837

Il semble que c'est une bonne occasion d'utiliser un AlertDialog.

Aussi basique que cela puisse paraître, Android n'a pas de boîte de dialogue intégrée pour cela (autant que je sache). Heureusement, c'est juste un peu de travail supplémentaire en plus de créer une AlertDialog standard. Vous devez simplement créer un EditText pour que l'utilisateur saisisse des données, et le définir comme vue de l'AlertDialog. Vous pouvez personnaliser le type d'entrée autorisé en utilisant setInputType, si nécessaire.

Si vous pouvez utiliser une variable membre, vous pouvez simplement définir la variable sur la valeur de l'EditText, et elle persistera après la fermeture de la boîte de dialogue. Si vous ne pouvez pas utiliser de variable membre, vous devrez peut-être utiliser un auditeur pour envoyer la valeur de la chaîne au bon endroit. (je peux éditer et élaborer davantage si c'est ce dont vous avez besoin).

Dans votre classe:

private String m_Text = "";

Dans l'OnClickListener de votre bouton (ou dans une fonction appelée à partir de là):

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Titre");

// Configuration de l'entrée
final EditText input = new EditText(this);
// Spécifiez le type d'entrée attendu; ici, par exemple, il définit l'entrée comme un mot de passe et masquera le texte
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
builder.setView(input);

// Configuration des boutons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
    @Override
    public void onClick(DialogInterface dialog, int which) {
        m_Text = input.getText().toString();
    }
});
builder.setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();
    }
});

builder.show();

0 votes

L'application semble planter lorsque j'appelle "builder.show();". Je reçois le message d'erreur suivant : "Impossible de créer un gestionnaire à l'intérieur d'un fil qui n'a pas appelé Looper.prepare();".

1 votes

J'ai un fil qui se met constamment à jour et qui affiche un objet écran, et j'appelle la méthode builder.show() dans la méthode update de l'objet écran.

2 votes

Oh. Si vous êtes sur un thread de travail, essayez de placer l'appel builder.show(); avec runOnUiThread, similaire à cet exemple : stackoverflow.com/a/3134720/1098302 Ou peut-être serait-il mieux de mettre tout le code ci-dessus (qui crée l'AlertDialog) dans une méthode séparée, et appeler cette méthode depuis runOnUiThread.

129voto

depodefi Points 358

Je vais ajouter à @la réponse d'Aaron avec une approche qui vous donne la possibilité de styliser la boîte de dialogue de manière plus efficace. Voici un exemple ajusté :

AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle("Titre");
// J'utilise un fragment ici donc j'utilise getView() pour fournir ViewGroup
// mais vous pouvez fournir ici n'importe quelle autre instance de ViewGroup de votre Fragment / Activité
View viewInflated = LayoutInflater.from(getContext()).inflate(R.layout.text_inpu_password, (ViewGroup) getView(), false);
// Configurer l'entrée
final EditText input = (EditText) viewInflated.findViewById(R.id.input);
// Spécifier le type d'entrée attendue; cela définit par exemple l'entrée comme un mot de passe et masquera le texte
builder.setView(viewInflated);

// Configurer les boutons
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
        m_Text = input.getText().toString();
    }   
}); 
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();
    }   
}); 

builder.show();

Voici la mise en page d'exemple utilisée pour créer la boîte de dialogue EditText :

Le résultat final :

Exemple de boîte de dialogue EditText

69voto

bhekman Points 993

Que diriez-vous de cet EXEMPLE? Cela semble simple.

final EditText txtUrl = new EditText(this);

// Définir le texte par défaut comme un lien vers la Reine
txtUrl.setHint("http://www.librarising.com/astrology/celebs/images2/QR/queenelizabethii.jpg");

new AlertDialog.Builder(this)
  .setTitle("Transformez en moustache le lien")
  .setMessage("Collez le lien d'une image à transformer en moustache !")
  .setView(txtUrl)
  .setPositiveButton("Transformez en moustache", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
      String url = txtUrl.getText().toString();
      moustachify(null, url);
    }
  })
  .setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
    }
  })
  .show();

4 votes

À peu près la même chose que celle d'Aaron, mais enchaîne le constructeur. Question de préférence personnelle car les deux fonctionnent bien.

19voto

Phan Van Linh Points 16963

Si vous souhaitez de l'espace à gauche et à droite de la vue input, vous pouvez ajouter un peu de marge comme ci-dessous :

private fun showAlertWithTextInputLayout(context: Context) {
    val textInputLayout = TextInputLayout(context)
    textInputLayout.setPadding(
        resources.getDimensionPixelOffset(R.dimen.dp_19), // si vous regardez le fichier android alert_dialog.xml, vous verrez que le textview du message a une marge de 14dp et un padding de 5dp. C'est la raison pour laquelle j'utilise 19 ici
        0,
        resources.getDimensionPixelOffset(R.dimen.dp_19),
        0
    )
    val input = EditText(context)
    textInputLayout.hint = "Email"
    textInputLayout.addView(input)

    val alert = AlertDialog.Builder(context)
        .setTitle("Réinitialiser le mot de passe")
        .setView(textInputLayout)
        .setMessage("Veuillez saisir votre adresse e-mail")
        .setPositiveButton("Soumettre") { dialog, _ ->
            // faire quelque chose avec input.text
            dialog.cancel()
        }
        .setNegativeButton("Annuler") { dialog, _ ->
            dialog.cancel()
        }.create()

    alert.show()
}

dimens.xml

19dp

J'espère que cela vous aidera

13voto

Abdullah Pariyani Points 163

Cela fonctionne pour moi

private void showForgotDialog(Context c) {
        final EditText taskEditText = new EditText(c);
        AlertDialog dialog = new AlertDialog.Builder(c)
                .setTitle("Mot de passe oublié")
                .setMessage("Entrez votre numéro de téléphone portable?")
                .setView(taskEditText)
                .setPositiveButton("Réinitialiser", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        String task = String.valueOf(taskEditText.getText());
                    }
                })
                .setNegativeButton("Annuler", null)
                .create();
        dialog.show();
    }

Comment appeler? (Nom de l'activité actuelle)

showForgotDialog(nom_de_l_activité_actuelle.this);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X