web-dev-qa-db-fra.com

Comment ajouter une case à cocher à une boîte de dialogue d'alerte

Actuellement, lorsque l'utilisateur ouvre mon application, un AlertDialog s'ouvre, lui demandant s'il souhaite passer à la version pro.

Je dois ajouter un CheckBox au AlertDialog qui empêchera l'application d'afficher le AlertDialog lorsque l'utilisateur ouvrira l'application.

Voici ce que j'ai pour le AlertDialog maintenant:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(" MY_TEXT");
    builder.setMessage(" MY_TEXT ")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   Uri uri = Uri.parse("market://details?id=MY_APP_PACKAGE");
                   Intent intent = new Intent (Intent.ACTION_VIEW, uri);
                   startActivity(intent);                          }
           })
           .setNegativeButton("No", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
               }
           }).show();

Comment ajouter un CheckBox au AlertDialog qui empêchera l'application d'afficher le AlertDialog lorsque l'utilisateur ouvre l'application?

38
user749911

Vous devez utiliser la méthode setView(View) sur le AlertDialog.Builder objet. Cela mettra le passé dans View entre la zone de message et les boutons. Gonflez simplement un View avec un CheckBox et passez-le. Voici un exemple:

checkbox.xml

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content" >

    <CheckBox
        Android:id="@+id/checkbox"
        style="?android:attr/textAppearanceMedium"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_margin="5dp" />

</FrameLayout>

Code dans votre activité

View checkBoxView = View.inflate(this, R.layout.checkbox, null);
CheckBox checkBox = (CheckBox) checkBoxView.findViewById(R.id.checkbox);
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

        // Save to shared preferences
    }
});
checkBox.setText("Text to the right of the check box.");

AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(" MY_TEXT");
    builder.setMessage(" MY_TEXT ")
           .setView(checkBoxView)
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   Uri uri = Uri.parse("market://details?id=MY_APP_PACKAGE");
                   Intent intent = new Intent (Intent.ACTION_VIEW, uri); 
                   startActivity(intent);                          }
           })
           .setNegativeButton("No", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
               }
           }).show();
84
Jason Robinson

Vous pouvez utiliser une liste multichoïque avec un seul élément:

final boolean[] checked = new boolean[] {false};
builder.setMultiChoiceItems(new String[]{"Remember decision"}, checked, new DialogInterface.OnMultiChoiceClickListener() {
               @Override
               public void onClick(DialogInterface dialogInterface, int i, boolean b) {
                   checked[i] = b;
               }
           });

Ensuite, dans la OnClick() d'un bouton de dialogue d'alerte, vous pouvez vérifier la valeur de checked[0] Et enregistrer cette valeur dans le Sharedpreferences de votre application:

builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialogInterface, int i) {
                       if(checked[0]){
                           SharedPreferences.Editor editor = settings.edit();
                           editor.putBoolean("preferences_never_buy_pro", true);
                           editor.apply();
                       }
                       dialog.cancel();

                   }
               });

Avec cette préférence, vous pouvez décider si la boîte de dialogue doit être affichée à nouveau à l'avenir.

3
Jannik B

Enter image description here

La façon de créer une liste de cases à cocher consiste à utiliser setMultiChoiceItems dans le AlertDialog.

// Set up the alert builder
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Choose some animals");

// Add a checkbox list
String[] animals = {"horse", "cow", "camel", "sheep", "goat"};
boolean[] checkedItems = {true, false, false, true, false};
builder.setMultiChoiceItems(animals, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
        // The user checked or unchecked a box
    }
});

// Add OK and Cancel buttons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        // The user clicked OK
    }
});
builder.setNegativeButton("Cancel", null);

// Create and show the alert dialog
AlertDialog dialog = builder.create();
dialog.show();

Ici, j'ai codé en dur quels éléments de la liste étaient déjà vérifiés. Il est plus probable que vous souhaitiez les suivre dans un ArrayList<Integer>. Voir exemple de documentation pour plus de détails. Vous pouvez également définir les éléments cochés sur null si vous souhaitez toujours que tout commence sans contrôle.

Pour context, vous pouvez utiliser this si vous êtes dans une activité.

Ma réponse plus complète est ici .

Version Kotlin

// Set up the alert builder
val builder = AlertDialog.Builder(context)
builder.setTitle("Choose some animals")

// Add a checkbox list
val animals = arrayOf("horse", "cow", "camel", "sheep", "goat")
val checkedItems = booleanArrayOf(true, false, false, true, false)
builder.setMultiChoiceItems(animals, checkedItems) { dialog, which, isChecked ->
    // The user checked or unchecked a box
}

// Add OK and Cancel buttons
builder.setPositiveButton("OK") { dialog, which ->
    // The user clicked OK
}
builder.setNegativeButton("Cancel", null)

// Create and show the alert dialog
val dialog = builder.create()
dialog.show()
1
Suragch

Vous devez d'abord définir une mise en page qui contient le message et la case à cocher pour désactiver l'alerte sur les vues suivantes. Ensuite, au lieu d'appeler builder.setMessage, vous appellerez:

builder.setView(myAlertViewWithDisablingCheckbox);

Ensuite, lorsque l'utilisateur clique sur le bouton de la boîte de dialogue d'alerte, vous devrez vérifier si cette case à cocher a été cochée et enregistrer cette préférence dans le SharedPreferences de votre application. Vous pouvez ensuite utiliser cette préférence pour déterminer si cette boîte de dialogue d'alerte doit à nouveau être affichée à l'utilisateur.

1
Mike Bockus