41 votes

Affichage de plusieurs lignes de texte et de variables dans un AlertDialog à l'aide de setMessage()

J'ai besoin d'afficher plusieurs lignes de texte dans un dialogue d'alerte. Si j'utilise plusieurs méthodes setMessage(), seul le dernier setMessage est affiché, comme indiqué ci-dessous.

final AlertDialog alertDialog = new AlertDialog.Builder(this).create();
                alertDialog.setTitle("Statistics:");
                alertDialog.setMessage("No. of attempts: " + counter);
                alertDialog.setMessage("No. of wins: " + counterpos);
                alertDialog.setMessage("No. of losses: " + counterneg);

Existe-t-il un moyen de créer une nouvelle ligne pour chacun de ces éléments dans le dialogue ? Comme en utilisant \n dans System.print.out() ; méthode.

Merci de votre attention !

85voto

Kenny C Points 1066

Vous pouvez faire quelque chose comme ceci

String alert1 = "No. of attempts: " + counter;
String alert2 = "No. of wins: " + counterpos;
String alert3 = "No. of losses: " + counterneg;
alertDialog.setMessage(alert1 +"\n"+ alert2 +"\n"+ alert3);

26voto

TofferJ Points 1765

Vous pouvez simplement créer une chaîne de caractères contenant tout ce que vous voulez montrer et ajouter " \n "à l'endroit où vous souhaitez que les retours à la ligne soient effectués.

alertDialog.setMessage("No. of attempts: " + counter + "\n" + 
            "No. of wins: " + counterpos + "\n" + 
            "No. of losses: " + counterneg);

Ou mieux encore, utiliser un StringBuilder :

StringBuilder sb = new StringBuilder();
sb.append("No. of attempts: " + counter);
sb.append("\n");
sb.append("No. of wins: " + counterpos);
sb.append("\n");
sb.append("No. of losses: " + counterneg);
alertDialog.setMessage(sb.toString());

La meilleure façon de procéder est d'extraire les textes statiques dans une ressource de type chaîne (dans le fichier strings.xml). Utilisez le %d (ou le %s si vous voulez insérer des chaînes plutôt que des ints) pour placer les valeurs dynamiques au bon endroit :

<string name="alert_message">No. of attempts: %1$d\nNo. of wins: %2$d\nNo. of losses: %3$d</string>

Et ensuite en code :

String message = getString(R.string.alert_message, counter, counterpos, counterneg);
alertDialog.setMessage(message);

12voto

shooley Points 71

Vous pouvez également insérer des nouvelles lignes directement dans le fichier strings.xml :

<string name="my_string_text">This would revert your progress.\n\n Are you sure you want to proceed?</string>

3voto

fridemar Points 31

Kotlin simplifie la solution en :

  • l'enchaînement des appels des méthodes de l'ensemble
  • utiliser des chaînes interpolées

comme suit :

"AlertDialog.Builder Cet objet Builder permet d'enchaîner les appels aux méthodes set. " ( https://developer.Android.com/reference/Android/app/AlertDialog.Builder )

    fun alertDemo() {
        var counter: Int = 5

        var counterpos: Int = 2
        var counterneg: Int = 3
        val builder = AlertDialog.Builder(this)
            .setTitle("Statistics:")
            .setMessage("""
                |number of
                |
                |attempts: $counter
                |wins: $counterpos
                |losses: $counterneg
                """.trimMargin())
            .show()
    }

J'avais préparé une capture d'écran du résultat, mais comme je suis nouveau ici, il semble que j'aie appris que le téléchargement de captures d'écran peut être réservé aux membres de la communauté de niveau supérieur. Ou ai-je oublié quelque chose ? Merci de m'éclairer (peut-être pas seulement) :)

La capture d'écran est présentée dans un format agréable sans montrer les barres.

PS : Pour les minimalistes, grâce au chaînage, nous pourrions même éliminer le redondant "val builder ="

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