2010-05-09 10 views
35

Android App 용 ProgressDialog를 만들려고합니다. 사용자에게 물건이나 버튼이없는 것을 보여주는 단순한 방법이지만 올바르게 만들 수는 없습니다. SDK와 함께 제공되는 샘플 코드뿐 아니라 포럼 및 자습서를 통해 살펴 보았지만 아무 소용이 없습니다. (선택된 매개 변수가 작동하지 않습니다 오류는 제외)Android : ProgressDialog가 표시되지 않습니다.

btnSubmit.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
     (...) 
      ProgressDialog pd = new ProgressDialog(MyApp.this); 
      pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      pd.setMessage("Working..."); 
      pd.setIndeterminate(true); 
      pd.setCancelable(false); 

      // now fetch the results 
      (...long time calculations here...) 

      // remove progress dialog 
      pd.dismiss(); 

가 나는 또한 pd.show();를 추가하는 시도하고 new ProgressDialog의 매개 변수가 전혀 아무것도의 결과로 주변에 엉망 :

이 내가 가진 무엇 의미 : ProgressDialog가 나타나지 않습니다. 응용 프로그램은 대화 상자를 추가하지 않은 것처럼 계속 실행됩니다.

내가 올바른 장소에서 대화 상자를 만들지 모르겠다. 나는 그것을 조금 옮겼지만 그 역시 도움이되지 못했다. 어쩌면 내가 틀린 맥락에있어? 위의 코드는 private ViewGroup _createInputForm() 안에 MyApp입니다. 모든 힌트 감사

,

답변

39

당신은 긴 계산을 시작하기 전에 pd.show 전화를해야하고 계산은 별도의 스레드에서 실행해야합니다. 이 스레드가 완료되면 곧 pd.dismiss()를 호출하여 prgoress 대화 상자를 닫아야합니다. 여기

당신은 예를 볼 수 있습니다

해서 ProgressDialog 생성 및 표시 스레드가 무거운 계산을 실행하기 위해 호출된다 : 스레드

@Override 
    public void onClick(View v) { 
     pd = ProgressDialog.show(lexs, "Search", "Searching...", true, false); 
     Search search = new Search( ... ); 
     SearchThread searchThread = new SearchThread(search); 
     searchThread.start(); 
    } 

을 여기에 :

private class SearchThread extends Thread { 

     private Search search; 

     public SearchThread(Search search) { 
      this.search = search; 
     } 

     @Override 
     public void run() {   
      search.search(); 
      handler.sendEmptyMessage(0); 
     } 

     private Handler handler = new Handler() { 

      @Override 
      public void handleMessage(Message msg) { 
       displaySearchResults(search); 
       pd.dismiss(); 
      } 
     }; 
    } 
+0

이 작업을 수행하기 위해 내 응용 프로그램을 다시 빌드했습니다.이 튜토리얼은 다른 스레드없이 가능했던 것처럼 들리지만 학습을 중단하지는 않습니다. 나는 완전히 끝나지 않았다. 이제는 ProgressDialog가 어디에 있어야하는지 (최소한 보여 주기만하면!), 결과가 오기 직전에 "깜박"하지만, 이제는 스스로 휴식을 취할 수 있다고 생각한다.) 도와 주셔서 정말로 고맙습니다! – Select0r

+2

ProgressDialog의 "깜박임"은 에뮬레이터에서만 발생하는 것으로 실제 장치에서는 발생하지 않습니다. 에뮬레이터가 요청 (onClick)이 실제로 처리되기 전에 에뮬레이터가 오래 걸리는 것처럼 보일 때까지 앱이 정지됩니다. 장치에, 다 괜찮아. – Select0r

+2

왜 우리는 pd = new ProgressDialog (this)를 사용하지 않는가? pd.show() ;? – Emerald214

24

나는 해결책을주고있다. 시도해보십시오 .... 먼저 onCreate() 전에 Activity에서 Progress Dialog를 정의하십시오. 방법.

비공개 ProgressDialog progressDialog;

이제는 oncreate 메소드에서 모든 버튼을 클릭하여 어떤 작업에서든 활성화 할 수 있습니다. 진행 표시 줄을 설정하십시오.

progressDialog = ProgressDialog.show(FoodDriveModule.this, "", "Loading..."); 

지금

new Thread() 
{ 
    public void run() 
    { 

    try 
     { 
     sleep(1500); 

    // do the background process or any work that takes time to see progreaa dialog 

     } 
    catch (Exception e) 
    { 
     Log.e("tag",e.getMessage()); 
    } 
// dismiss the progressdialog 
    progressDialog.dismiss(); 
} 
}.start(); 

그게 모두를 표시하고 숨길의 ProgressBar를 Hamndle하는 스레드를 사용!

+0

progressDialog를 완벽하게 보여줍니다. 그러나 내 맥락은 조금 다릅니다. 한 응용 프로그램에서 다른 응용 프로그램으로 전환 할 때 progressDialog를 표시하고 흑백을 피하고자합니다. 가능한가? – YuDroid

3

AsyncTask을 사용하여 가능합니다. 이 클래스는 스레드를 만듭니다. 하위 클래스를 만들고 doInBackground(...) 메서드를 채워야합니다.

4

분리 된 스레드를 사용해야하므로 진행 대화 상자가 표시되지 않습니다. Android의 모범 사례는 AsyncTask (적극 권장)입니다. 본 내용은 answer입니다.

관련 문제