Хорошо, это будет немного сложнее, но повисните со мной. У меня есть следующий сценарий, который я не могу добраться до работы:Открытие пользовательского диалога внутри диалогового окна предупреждения
- Подскажите пользователю сохранять (ОК или отменить)
- В OnClick для «ОК», сделать задачу Async, чтобы получить какие-то данные. Сделайте это синхронно
- Затем создайте пользовательский диалог, чтобы отобразить эти данные, чтобы запросить у пользователя дополнительную информацию. [ЭТО ЧАСТЬ НЕ РАБОТАЕТ).
- Выполнение другой задачи Async, где я сохраняю данные.
Итак, есть ли неотъемлемая проблема с созданием пользовательского диалога внутри AlertDialog?
Поведение, которое происходит, состоит в том, что все операции выполняются, и в конце пользовательский диалог отображается и затем исчезает. Он должен отображаться до последней задачи Async и не допустить, чтобы задача Async выполнялась до того, как она собрала необходимые данные.
я упростил код проблемы в этом:
AlertDialog.Builder submitDialog = new AlertDialog.Builder(this);
submitDialog.setMessage("Are you sure you want to end this Preview of the form? It will no longer be availabe for editing");
}
else {
submitDialog.setTitle("Submit?");
submitDialog.setMessage("Are you sure?");
}
submitDialog.setNegativeButton("Cancel", null);
submitDialog.setPositiveButton("OK", new AlertDialog.OnClickListener() {
public void onClick(DialogInterface dialog, int arg1) {
// =============================
// 1st Async
// =============================
// Make synchronous since need data. Must be a task cause hitting server
Test test = null;
try {
test = new workflowTask().execute().get();
}
catch (Exception ex) {
// nothing
}
// =============================
// Customer Dialog Get more info
// =============================
// Prompt for data here...
String[] listContent = {"[email protected]", "[email protected]"};
// custom dialog
Dialog dialog = new Dialog(MyActivity.this);
dialog.setContentView(R.layout.dialog_email_picker);
dialog.setTitle("Select email and enter comments");
ListView emails = (ListView) dialog.findViewById(R.id.emaillist);
ArrayAdapter<String> adapter = new ArrayAdapter<String> (MyActivity.this, android.R.layout.simple_list_item_1, listContent);
emails.setAdapter(adapter);
emails.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(), parent.getItemAtPosition(position).toString() + " clicked", Toast.LENGTH_LONG).show();
}
});
Button dialogButton = (Button) dialog.findViewById(R.id.dialogButtonOK);
// if button is clicked, close the custom dialog
dialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "ok clicked", Toast.LENGTH_LONG).show();
}
}
});
dialog.show();
// =============================
// 2nd Async
// =============================
new submitFormResultTask().execute();
}
}
});
submitDialog.show();
Почему не просто закрыть диалоговое окно предупреждения о postExecute первого AsyncTask после получения данных? Затем, когда вы запрашиваете дополнительную информацию, отобразите свой собственный диалог с извлеченными данными. Таким образом, вы полностью избегаете проблемы. – DigitalNinja
Вид эха @DigitalNinja, я думаю, вы должны изменить свой интерфейс. Несколько диалогов в одно и то же время или в быстрой последовательности не являются хорошим пользовательским интерфейсом. Используйте Activity или специальный диалог _single_, который обрабатывает весь поток (и, по-видимому, остается на экране в течение всей продолжительности). Вы можете отключить поле ввода (-ов), когда пользователь отправит и покажет счетчик, пока работает первая AsyncTask. – Karakuri
@ Цифровой ниндзя. Я попробовал это - безуспешно отклонить исходный диалог оповещений в postExecute. Не уверен, что я делаю что-то не так. –