web-dev-qa-db-fra.com

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 une boîte de dialogue d'alerte. Si j'utilise plusieurs méthodes setMessage (), seul le dernier setMessage s'affiche, comme illustré 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 d'eux dans la boîte de dialogue? Comme utiliser\n dans System.print.out (); méthode.

Merci!

34
Navigatron

Vous pouvez faire quelque chose comme ça

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);   
73
Kenny C

Vous pouvez simplement créer une chaîne de tout ce que vous souhaitez afficher et ajouter "\ n" à l'endroit où vous souhaitez que les sauts de ligne soient.

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

Ou encore mieux d'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());

Et la meilleure façon de le faire serait d'extraire les textes statiques dans une ressource de chaîne (dans le fichier strings.xml). Utilisez% d (ou% s si vous souhaitez insérer des chaînes plutôt que des entiers) pour obtenir les valeurs dynamiques aux bons endroits:

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

Et puis en code:

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

Vous pouvez également insérer des sauts de ligne 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>

12
shooley

Kotlin simplifie la solution en:

  • enchaîner les appels des méthodes définies
  • à l'aide de chaînes interpolées

comme suit:

"AlertDialog.Builder Cet objet Builder pour permettre le chaînage des appels pour définir des méthodes" ( 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 limité aux pairs de la communauté de niveau supérieur. Ou ai-je raté quelque chose? Merci de m'éclairer (peut-être pas seulement) moi-même :)

La capture d'écran est dans un format sympa sans montrer les barres.

PS: Pour les minimalistes, en raison du chaînage, nous pourrions même éliminer le redondant "val builder ="

1
fridemar