2012-04-05 18 views
0

私のアプリケーションでログインダイアログを完了しようとしていますが、ダイアログの処理に問題があります。ダイアログからダイアログを呼び出す

3つのダイアログがあります。まず、ログインダイアログとしてAlertDialog、2番目に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コールがユーザデータを検証するWebサービスを消費するように構成されています。ここに私のコードです。ユーザーが通話を待っている間、progressDialogが作業を示すために表示されます。呼び出しが行われた後、ユーザデータが有効でない場合は、 DIALOG_NO_LOGIN_USER_IDダイアログが表示されます。ユーザーがOKをクリックすると、ログインダイアログが再度表示されます。

しかし、DIALOG_NO_LOGIN_USER_IDダイアログが表示されません。スレッドを開始した後にshowDialog()を呼び出そうとしましたが、スレッドの問題があります。ダイアログが表示されますが、検証の結果は無視されます。

ダイアログの管理方法を教えてもらえますか? AlertDialogをログインダイアログとして使用するための、他の、おそらく「より良い」ソリューションはありますか?

に関して、 HTZ

答えて

0

この問題を解決するには最高の説明は、ダイのJavaDocに与えられたクラスの使用

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

を作っていた。

「AsyncTaskは、UIスレッドの適切かつ容易に使用できるようになります。この。スレッドやハンドラを操作することなく、バックグラウンド操作を実行し、UIスレッドで結果を公開することができます。

onPreExecute()の方法を使用すると、UIスレッドの表示を操作できます。

このメソッドを終了すると、doInBackground()が呼び出され、ここでバックグラウンド操作を開始できます。このメソッドはUIスレッドでは機能していないため、アプリケーションをブロックしていません。

この後にonPostExecute()が呼び出され、計算結果が使用できます。

私の問題は、バックグラウンドの観測が行われている間に進捗インジケータを正しく表示することでした。これは、バックグラウンド計算が行われている間に、UIスレッドで動作しているonProgressUpdate()メソッドを使用することによって行うことができます。

0

さて、あなたは別の1の内側にダイアログを呼び出す必要はありません、すべてのあなたの最初の。あなたは何をしているのですか?onClickListenerをダイアログボタンに取得し、それに応じて処理します。例えばユーザーが"connect" (positive button)をクリックすると、onClick()メソッドで次のダイアログが表示されます。

しかし、そのようにしたい場合は、Activity Contextが必要です。これをカスタムダイアログのパラメータとして渡して、そのコンテキストを使用して新しいダイアログを呼び出すことができます。

+0

これは私がやっていることです...最初のDialogのonClick()メソッドで次の2番目のDialogを呼び出します。私は最初のダイアログを作成し、onClick()でスレッドが開始されます。このスレッドの最後に、次のダイアログが表示されます。スレッドが動作している間、進捗ダイアログが表示されます。 文脈のことを説明できますか?なぜ私はこれを動作させるための特別なコンテキストが必要なのかはわかりません。私はすでに 'this'を呼び出すことによって' activity context'を使用しています – htz

+0

あなたは 'context'のためにgoogleする必要があります。また、 'onClick'に入れたくない場合、ダイアログが閉じられたときにだけそれを望むならば、ダイアログに' OnDismissListener'を設定することができます。 – Rajkiran

関連する問題