#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 в ДРУГОМ диалоговом окне, которое я также переименовал. Спасибо за помощь!!