Как я могу отключить пользовательский диалог — до того, как он был создан?

#android

#Android

Вопрос:

Очевидно, что у меня есть случай того, что я люблю называть синдромом «курица или яйцо». Я пытаюсь найти способ отключить диалоговое окно с предупреждением, которое не создается до окончания процесса.

Что я пытаюсь сделать: Когда меня спрашивают «Вы хотите ПОВТОРНО ЗАГРУЗИТЬ эту галерею?», я хочу ОТКЛЮЧИТЬ основное всплывающее окно (alert / builder), когда я получаю ответ «Да». Но не тогда, когда я получаю ответ «Нет». Другими словами, я хотел бы поместить туда alert.dismiss() … но я не могу, потому что оно не создается до конца процесса.

Имеет ли это смысл? Я ломаю голову над этим, пытаясь найти другой способ представить это пользователю.

Вот мой код:

 public void showGalleriesDialogue(String galleriesArray) {
Log.v("Status","Ran alert dialogue routine."); 
final CharSequence[] items = TextUtils.split(galleriesArray, "\^");

final AlertDialog.Builder builder = new AlertDialog.Builder(MainMenu.this);
builder.setTitle("Choose a Gallery to download:");

builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        final String galleryToDownload = (String) items[item].toString();

        // Check to ensure that this doesn't all ready exist            
        File checkExisists = new File(Environment.getExternalStorageDirectory().getAbsolutePath()   "/pm-pvault/"   galleryToDownload);
        Log.v("Status","Checking to ensure that '" checkExisists "' does not exist."); 
        if(checkExisists.exists()) {
                AlertDialog.Builder existsBuilder = new AlertDialog.Builder(MainMenu.this);
                existsBuilder.setTitle("But wait!");
                existsBuilder.setMessage("This gallery already exists. Do you want to RE-INSTALL it?")
                       .setCancelable(false)
                       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int id) {
                                // Preview stuff, then go get it.
                               GlobalDataStore.retrycount = 0;
                            preview(galleryToDownload);
                               }
                       })
                       .setNegativeButton("No", new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int id) {
                               // Never mind.
                                dialog.cancel();
                           }
                       });
                AlertDialog existsAlert = existsBuilder.create();
                existsAlert.show();
            }
        //OR ELSE
        else 
            if(galleryToDownload.contains("@")==true)  
               {
            AlertDialog.Builder doItNasty = new AlertDialog.Builder(MainMenu.this);
            doItNasty.setTitle("DISCLAIMER");
            doItNasty.setMessage(R.string.nastyDisclaimer)
                   .setCancelable(false)
                   .setPositiveButton("I AGREE", new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int id) {
                            // Download stuff, go get it.
                           GlobalDataStore.retrycount = 0;
                           preview(galleryToDownload);
                       }
                   })
                   .setNegativeButton("DISAGREE", new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int id) {
                           // Never mind.
                           dialog.cancel();
                       }
                   });
            AlertDialog nastyAlert = doItNasty.create();
            nastyAlert.show();
               }
                else {
                    // Out of IF conditions to meet.  Go download it now.
                    GlobalDataStore.retrycount = 0;
                    preview(galleryToDownload);
                    }
            } // END OR ELSE
    }
});
final AlertDialog alert = builder.create();
alert.show();
}
  

Ответ №1:

Почему бы просто не установить флаг, когда пользователь выбирает «да» или «нет», затем, когда придет время создавать диалоговое окно, проверьте свой флаг, и если пользователь выбрал «да», то не создавайте его. Таким образом, вам не нужно беспокоиться о вызове dismiss для него, потому что вы его не создали.

Комментарии:

1. Мне понравился этот ответ. Но это не сработало, когда я попытался сделать это таким образом. Похоже, что в итоге я столкнулся с той же проблемой, которая заключалась в том, что, поскольку диалог не создается до конца процесса, я не могу вставить какие-либо флаги, чтобы проверить статус да / нет и действовать в соответствии с этими ответами. Я также пытался использовать переменную вне области видимости этого класса (например, GlobalDataStore.flagYES) … но опять же… та же проблема!

Ответ №2:

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

Проблема в том, что вы переопределяете переменную ‘dialog’, поэтому у вас нет возможности получить доступ к ‘внешнему’ диалогу.

Попробуйте сделать это что-то вроде:

 .setNegativeButton("No", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface redownloadDialog, int id) {
        // Never mind.
        redownloadDialog.cancel();
        dialog.cancel();
    }
});
  

Комментарии:

1. Пока вы не указали на это… Я действительно не осознавал, что я делал, называя все мои диалоги «dialog». Как только я переименовал самый верхний диалог в «mainDialog», я смог выполнить mainDialog.cancel в ДРУГОМ диалоговом окне, которое я также переименовал. Спасибо за помощь!!