How to add a check box to an alert dialog

2019-02-01 06:11发布

问题:

Currently when the user opens my app an AlertDialog opens asking them if they would like to upgrade to the pro version. I need to add a CheckBox to the AlertDialog that will make the app no longer show the AlertDialog when the user opens the app.

Here is what I have for the AlertDialog now:

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();

If someone could show me how to add a CheckBox to the AlertDialog that will make the app no longer show the AlertDialog when the user opens the app, that would be great. Thanks in advance!

回答1:

You have to use the method setView(View) on the AlertDialog.Builder object. This will put the passed in View between the message area and buttons. Simply inflate a View with a CheckBox and pass that in. Here's an example:

checkbox.xml

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

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

</FrameLayout>

Code in your Activity

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();


回答2:

First you need to define a layout that contains the message and checkbox for disabling the alert on subsequent views. Then instead of calling builder.setMessage, you'll call:

builder.setView(myAlertViewWithDisablingCheckbox);

Then when the user clicks on the alert dialog button, you'll have to check to see if that checkbox has been checked, and save that preference in your app's SharedPreferences. Then you can use that preference to determine if this alert dialog should be shown to the user again.



回答3:

You could use a multichoicelist with only one item:

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;
               }
           });

Then in the OnClick() of an alert dialog button you can check the value of checked[0]and save that value in your app's Sharedpreferences:

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();

                   }
               });

With this preference you can decide whether the dialog should be shown again in the future.