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?
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();
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.
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 .
// 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()
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.