2012-04-05 4 views
0

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

У меня есть три диалоговых окна: сначала AlertDialog в качестве диалогового окна входа в систему, второй - progressDialog и alertDialog, который отображает сообщение об ошибке. Вот мой код:

protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case KBConstants.DIALOG_LOGIN_ID: 
     TextView textUsername; 
     TextView textPassword; 
     TextView textSave; 
     // Here I build my Layout 
     ... 
     // return dialog 
     return new AlertDialog.Builder(this).setTitle(R.string.login_title).setMessage(R.string.login_introduction).setView(loginLayout).setIcon(R.drawable.kreative_barometer_72x72) 
       .setPositiveButton(R.string.login_ok, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         final DialogInterface d = dialog; 
         if (checkBoxSave.isChecked()) { 
          setRememberLogin(true); 
         } else { 
          setRememberLogin(false); 
         } 
         waitConnect = ProgressDialog.show(KreativBarometerMainView.this, getString(R.string.login_connect_title), getString(R.string.login_connect_introduction), false, true); 
         Thread t1 = new Thread() { 
          public void run() { 
           Looper.prepare(); 
           DataStruct dataStruct = null; 
           try { 
            dataStruct = SoapHandler.makeCall(SoapHashMap.CHECK_USER_LOGIN, mainService.getSoapMap(), editUsername.getText().toString(), editPassword.getText().toString(), null, null); 
            ServerMessageStruct sms = (ServerMessageStruct) dataStruct; 
            if (sms.getMsgType() == 1) { 
             mainService.setUserValidation(true); 
             setLogin(editUsername.getText().toString(), editPassword.getText().toString()); 
            } else { 
             mainService.setUserValidation(false); 

             setLogin(null, null); 
                       } 
           } catch (IOException ioe) { 
            mainService.setUserValidation(false); 
            setLogin(null, null); 

           } catch(XmlPullParserException xmlppe){ 

           } finally{ 
            if(!mainService.isUserValidated()){ 
             waitConnect.dismiss(); 
             showDialog(KBConstants.DIALOG_NO_LOGIN_USER_ID); 
            } 
           } 
           waitConnect.dismiss(); 
          } 
         }; 
         t1.start(); 

        } 
       }).setNeutralButton(R.string.login_setup, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 

         /* User clicked setup so do some stuff */ 
         startActivity(new Intent(packageContext, SettingView.class)); 
        } 
       }).setNegativeButton(R.string.login_cancel, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 

         /* User clicked cancel so do some stuff */ 
         KreativBarometerMainView.this.finish(); 
        } 
       }).setOnCancelListener(new DialogInterface.OnCancelListener() { 
        @Override 
        public void onCancel(DialogInterface dialog) { 
         KreativBarometerMainView.this.finish(); 

        } 
       }).create(); 
    case KBConstants.DIALOG_NO_LOGIN_USER_ID: 
     return new AlertDialog.Builder(this).setMessage(R.string.login_info_error_user).setIcon(R.drawable.kreative_barometer_72x72).setTitle(R.string.login_error) 
       .setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         showDialog(KBConstants.DIALOG_LOGIN_ID); 
        } 
       }).create(); 
    } 
    return null; 
} 

Когда пользователь нажимает на «подключении» (положительная кнопке) вызов SOAP производится потреблять веб-сервис, который проверяет пользовательские данные. Пока пользователь ожидает, что вызов будет выполнен, отображается индикация progressDialog, указывающая на работу. После того, как вызов был выполнен, должен отображаться диалоговое окно DIALOG_NO_LOGIN_USER_ID, если данные пользователя недействительны. Пользователь может нажать кнопку «ОК», и снова появится диалоговое окно входа в систему.

Диалоговое окно DIALOG_NO_LOGIN_USER_ID не отображается. Я попытался вызвать showDialog() после того, как был запущен Thread, но затем возникают проблемы с потоками. Диалоговое окно отображается, но результат проверки игнорируется.

Может ли кто-нибудь помочь мне понять, как управлять диалоги? Есть ли другое, возможно «лучшее» решение для использования AlertDialog в качестве диалогового окна входа?

С уважением, ХТЗ

ответ

0

Решение этой проблемы делает использование класса

android.os.AsyncTask<Params, Progress, Result>

Лучшее описание дано в фильеры JavaDoc:.

«AsyncTask позволяет правильное и простое использование потока пользовательского интерфейса This class позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками ».

С помощью методов onPreExecute() вы можете манипулировать представлением на тему пользовательского интерфейса.

После завершения этого метода вызывается doInBackground(), и здесь вы можете начинать фоновые операции. Этот метод не работает над потоком пользовательского интерфейса, поэтому он не блокирует ваше приложение.

После этого вызывается onPostExecute(), и вы можете использовать свои вычислительные результаты.

Моя проблема заключалась в том, чтобы правильно отобразить индикатор прогресса, когда сделаны фоновые изображения. Это можно сделать, используя метод onProgressUpdate(), который работает с потоком пользовательского интерфейса, в то время как выполняется фоновое вычисление.

0

Ну, во-первых из вас все, что вы не должны вызвать диалог внутри другого. То, что вы делаете, это просто активировать кнопки onClickListener для диалога и делать то, что нужно. например Когда пользователь нажимает на ваш "connect" (positive button), вы вызываете следующее диалоговое окно в методе onClick().

Но все же, если вы хотите только этого, вам нужен Activity Context, который вы можете передать в качестве параметра в свой собственный диалог и вызвать новое диалоговое окно с использованием этого контекста.

+0

Но это то, что я делаю ... Я вызываю следующий диалог в методе onClick() первого диалога. Я создаю первое диалоговое окно и в onClick() запускается поток. В конце этого потока должно быть показано следующее диалоговое окно. Пока поток работает, следует показать прогресс. Можете ли вы объяснить контекст? Мне непонятно, почему мне нужен особый контекст, чтобы заставить это работать. Я уже использую «контекст активности», вызывая 'this' – htz

+0

Вы должны google для' context'. И если вы не хотите этого в 'onClick' и хотите его только тогда, когда диалог отклонен, вы можете установить' OnDismissListener' в свой диалог. – Rajkiran

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