2012-04-05 11 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()를 호출하려고했지만 스레드 문제가 발생했습니다. 대화 상자가 표시되지만 유효성 검사의 결과는 무시됩니다.

대화 상자를 관리하는 방법을 쉽게 이해할 수 있습니까? AlertDialog를 로그인 대화 상자로 사용하는 다른 "아마도 좋은"솔루션이 있습니까? 당신이 다른 하나의 내부 대화 상자를 호출 할 필요는 없다 우선

관련, HTZ

답변

0

이 문제의 해결책 제작 하였다 사용은 가장 설명 다이의 JavaDoc 주어진다 클래스는 백그라운드 작업을 수행하고 스레드 및/또는 핸들러를 조작하지 않고도 UI 스레드에서 결과를 게시 할 수 있습니다. "

onPreExecute() 메서드를 사용하면 UI 스레드에서보기를 조작 할 수 있습니다.

이 메서드를 완료하면 doInBackground()이 호출되며 여기에서 백그라운드 작업을 시작할 수 있습니다. 이 메서드는 UI 스레드에서 작동하지 않으므로 응용 프로그램이 차단되지 않습니다.

이 후 onPostExecute()이 호출되고 계산 결과를 사용할 수 있습니다.

배경 문제가 진행되는 동안 진행률 표시기를 올바르게 표시하는 것이 문제였습니다. 배경 계산이 수행되는 동안 UI 스레드에서 작동하는 onProgressUpdate() 메서드를 사용하여이 작업을 수행 할 수 있습니다.

0

음. 당신은 단지 대화 버튼에 onClickListener를 가져 와서 그에 따라 작업을 수행하는 것입니다. 예 : 사용자가 "connect" (positive button)을 클릭하면 onClick() 방법으로 다음 대화 상자가 열립니다.

그래도 그런 식으로 만 원한다면 Activity Context이 필요합니다. 사용자 정의 대화 상자의 매개 변수로 전달하고 해당 컨텍스트를 사용하여 새 대화를 호출 할 수 있습니다. .

"AsyncTask를는 UI 스레드 적절한 손쉽게 사용할 수 있도록 본 : 클래스

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

+0

하지만이 일은 내가하고있는 일이다 ... 나는 첫 번째 Dialog의 onClick() 메서드에서 다음 두 번째 Dialog를 호출한다. 첫 번째 대화 상자를 만들고 onClick()에서 스레드가 시작됩니다. 이 스레드가 끝나면 다음 대화 상자가 표시됩니다. 스레드가 작동하는 동안 진행 대화 상자가 표시되어야합니다. 문맥을 설명 할 수 있습니까? 왜 이것이 작동하도록 특별한 상황이 필요한지는 분명하지 않습니다. 나는 이미'this '를 호출하여'activity context'를 사용하고 있습니다. – htz

+0

'context'에 대해 google을 사용해야합니다. 그리고 만약 당신이'onClick'에 그것을 원하지 않고 대화 상자가 해제 될 때에 만 그것을 원한다면, 대화 상자에'OnDismissListener'를 설정할 수 있습니다. – Rajkiran

관련 문제