Как добавить флажок в диалоговое окно оповещения - PullRequest
37 голосов
/ 19 марта 2012

В настоящее время, когда пользователь открывает мое приложение, открывается AlertDialog, спрашивая их, хотят ли они перейти на профессиональную версию.

Мне нужно добавить CheckBox к AlertDialog, которыйзаставит приложение больше не отображать AlertDialog, когда пользователь откроет приложение.

Вот что у меня есть для AlertDialog сейчас:

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

Как добавитьCheckBox до AlertDialog, что заставит приложение больше не показывать AlertDialog, когда пользователь открывает приложение?

Ответы [ 4 ]

81 голосов
/ 19 марта 2012

Вы должны использовать метод setView(View) для объекта AlertDialog.Builder.Это поместит переданный в View между областью сообщения и кнопками.Просто накачайте View с помощью CheckBox и передайте это. Вот пример:

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>

Код в вашей деятельности

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();
3 голосов
/ 19 мая 2017

Вы можете использовать мультиизбранный список только с одним элементом:

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

Затем в OnClick() кнопки диалога с предупреждением вы можете проверить значение checked[0] и сохранить его в своем приложении 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();

                   }
               });

С помощью этого предпочтения вы можете решить, будет ли диалоговое окно отображаться снова в будущем.

1 голос
/ 05 июня 2019

Enter image description here

Способ создания списка флажков заключается в использовании setMultiChoiceItems в 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();

Здесь я жестко запрограммированкакие пункты в списке уже были проверены.Скорее всего, вы захотите отслеживать их в ArrayList<Integer>.См. пример документации для получения более подробной информации.Вы также можете установить отмеченные элементы на null, если вы всегда хотите, чтобы все начиналось без проверки.

Для context вы можете использовать this, если вы в Деятельности.

Мой полный ответ: здесь .

версия 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 голос
/ 19 марта 2012

Сначала необходимо определить макет, который содержит сообщение и флажок для отключения оповещения в последующих представлениях.Затем вместо того, чтобы звонить builder.setMessage, вы будете звонить:

builder.setView(myAlertViewWithDisablingCheckbox);

Затем, когда пользователь нажимает кнопку диалога предупреждения, вам нужно будет проверить, был ли установлен этот флажок, и сохранитьэто предпочтение в вашем приложении SharedPreferences.Затем вы можете использовать это предпочтение, чтобы определить, нужно ли пользователю снова показывать это диалоговое окно с предупреждением.

...