2012-04-05 24 views
0

Ich versuche, meinen Anmeldedialog in meiner Anwendung abzuschließen, und ich habe Probleme mit dem Umgang mit meinen Dialogen.Aufrufen eines Dialogfelds aus einem Dialogfeld

Ich habe drei Dialoge, zuerst einen AlertDialog als Anmeldedialog, zweitens einen progressDialog und einen alertDialog, der eine Fehlermeldung anzeigt. Hier ist mein Code:

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; 
} 

Wenn ein Benutzer klickt auf „connect“ (positive Taste) ein SOAP-Aufruf erfolgt eine Webservice zu konsumieren, die die Benutzerdaten validiert. Während der Benutzer auf den Anruf wartet, zeigt der Fortschrittsdialog die Arbeit an. Nachdem der Anruf getätigt wurde, sollte der Dialog DIALOG_NO_LOGIN_USER_ID angezeigt werden, wenn die Benutzerdaten nicht gültig waren. Der Benutzer kann auf OK klicken und der Anmeldedialog wird erneut angezeigt.

Der Dialog DIALOG_NO_LOGIN_USER_ID wird jedoch nicht angezeigt. Ich habe versucht, den showDialog() aufzurufen, nachdem der Thread gestartet wurde, aber dann gibt es Threading-Probleme. Der Dialog wird angezeigt, aber das Ergebnis der Validierung wird ignoriert.

Kann mir jemand helfen zu verstehen, wie man die Dialoge verwaltet? Gibt es eine andere, vielleicht "bessere" Lösung für die Verwendung eines AlertDialogs als Anmeldedialog?

Grüßen, htz

Antwort

0

Die Lösung für dieses Problem wurde die Nutzung der Klasse

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

Die beste Beschreibung ist in sterben JavaDoc gegeben.

„AsyncTask ermöglicht korrekte und einfache Nutzung des UI-Thread Diese class ermöglicht es, Hintergrundoperationen auszuführen und Ergebnisse auf dem UI-Thread zu veröffentlichen, ohne dass Threads und/oder Handler manipuliert werden müssen. "

Mit den Methoden onPreExecute() können Sie View auf dem UI-Thread bearbeiten.

Nach Beendigung dieser Methode wird doInBackground() aufgerufen und Sie können Ihre Hintergrundoperationen starten. Diese Methode funktioniert nicht auf dem UI-Thread, sodass Ihre Anwendung nicht blockiert wird.

Danach wird onPostExecute() aufgerufen und Sie können Ihre Computerergebnisse verwenden.

Mein Problem war, eine Fortschrittsanzeige korrekt anzuzeigen, während die Hintergrundauswertungen vorgenommen wurden. Dies kann unter Verwendung der onProgressUpdate()-Methode, die über den UI-Thread arbeitet, erfolgen, während die Hintergrundberechnungen durchgeführt werden.

0

Nun, zunächst Ihnen alles, was Sie nicht einen Dialog innerhalb einer anderen aufrufen müssen. Was Sie tun, ist nur die OnClickListener zu Dialog-Schaltflächen und die Dinge entsprechend zu tun. z.B. Wenn der Benutzer auf "connect" (positive button) klickt, rufen Sie den nächsten Dialog in der onClick() Methode auf.

Aber immer noch, wenn Sie es nur so wollen, dann brauchen Sie eine Activity Context, die Sie als Parameter an Ihren benutzerdefinierten Dialog übergeben und einen neuen Dialog mit diesem Kontext aufrufen können.

+0

Aber das ist was ich tue ... Ich rufe den nächsten zweiten Dialog in der onClick() Methode des ersten Dialogs auf. Ich erstelle den ersten Dialog und im onClick() wird ein Thread gestartet. Am Ende dieses Threads sollte der nächste Dialog angezeigt werden. Während der Thread läuft, sollte ein Fortschrittdialog angezeigt werden. Können Sie die Context-Sache erklären? Es ist mir nicht klar, warum ich einen speziellen Kontext brauche, um dies zum Laufen zu bringen. Ich benutze bereits den 'activity context' durch Aufruf von' this' – htz

+0

Sie müssen googlen für 'context'. Und wenn Sie es nicht in 'onClick' wollen und es nur dann wollen, wenn der Dialog geschlossen wird, dann können Sie' OnDismissListener' in Ihrem Dialog einstellen. – Rajkiran

Verwandte Themen