2015-08-08 3 views
0

Хорошо, это будет немного сложнее, но повисните со мной. У меня есть следующий сценарий, который я не могу добраться до работы:Открытие пользовательского диалога внутри диалогового окна предупреждения

  1. Подскажите пользователю сохранять (ОК или отменить)
  2. В OnClick для «ОК», сделать задачу Async, чтобы получить какие-то данные. Сделайте это синхронно
  3. Затем создайте пользовательский диалог, чтобы отобразить эти данные, чтобы запросить у пользователя дополнительную информацию. [ЭТО ЧАСТЬ НЕ РАБОТАЕТ).
  4. Выполнение другой задачи 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(); 
+0

Почему не просто закрыть диалоговое окно предупреждения о postExecute первого AsyncTask после получения данных? Затем, когда вы запрашиваете дополнительную информацию, отобразите свой собственный диалог с извлеченными данными. Таким образом, вы полностью избегаете проблемы. – DigitalNinja

+0

Вид эха @DigitalNinja, я думаю, вы должны изменить свой интерфейс. Несколько диалогов в одно и то же время или в быстрой последовательности не являются хорошим пользовательским интерфейсом. Используйте Activity или специальный диалог _single_, который обрабатывает весь поток (и, по-видимому, остается на экране в течение всей продолжительности). Вы можете отключить поле ввода (-ов), когда пользователь отправит и покажет счетчик, пока работает первая AsyncTask. – Karakuri

+0

@ Цифровой ниндзя. Я попробовал это - безуспешно отклонить исходный диалог оповещений в postExecute. Не уверен, что я делаю что-то не так. –

ответ

0

Почему вы не используете в viewflipper в вашем «уникальный» пользовательский диалог? поэтому после первого нажатия кнопки «ОК» вы можете проверить, видна ли первая страница, а затем вы можете показать вторую страницу и только с этого момента, если пользователь нажмет «ОК», вы можете вызвать метод «увольнение»().

Таким образом, вы можете выполнить своего рода мастер с возможностью возврата на первый взгляд, если пользователь должен что-то изменить. Имеют смысл?

+0

Этапы немного более сложны. Этот сценарий происходит только при специальном условии - поэтому он не всегда встречается.Наверное, я могу создать оригинальный диалог со скрытым разделом после выбора «ОК», но тогда по сути это другой диалог, так как я не хочу отображать то, что я только что отображал. Не уверен, что нажатие на это действие изменит что-либо, поскольку по-прежнему будет шаг оригинальной асинхронизации, затем диалог, за которым последует другой асинхронный. –

+0

Также это может произойти в трех разных местах кода, с добавленной сложностью в том, что он находится в цикле. Я подумал, что сначала попробую простой сценарий. При этом я попытаюсь выполнить каждое из этих предложений и посмотреть, что работает. Благодаря! –

+0

Счастливое кодирование! :) –

0

Для дальнейшего использования, как я решил, это было на самом деле назвать AsyncTask в onClick второго диалога. Какой-то уродливый, но я не мог заставить ничего работать. Я бы подумал, что до тех пор, пока это будет модальный диалог, который будет запущен Android, пока его работа не будет выполнена - это не так, она просто провела следующую строку кода (вторая AsyncTask). Так что это выглядит примерно так:

AlertDialog -> AsyncTask.get() (так синхронно) клиента Dialog onClick-> второй AsyncTask

Смежные вопросы