2011-01-06 2 views
2

나는 Dialog와 ProgressDialog라는 private 속성으로 2 개의 대화 상자가있는 Overlay 확장 기능을 가지고 있습니다. MapView에서 오버레이를 클릭하면 Dialog 객체가 나타납니다. 사용자가 대화 상자에서 단추를 클릭하면 해당 단추가 사라지고 ProgressDialog가 표시됩니다. 동시에 백그라운드 태스크는 실행중인 서비스에 알리는 것으로 시작됩니다. 작업이 완료되면 Overlay 개체의 메서드 (buildingLoaded)가 호출되어 View가 전환되고 ProgressDialog가 닫힙니다. 보기가 전환되고 코드가 실행 중이지만 (디버거를 사용하여 검사 한) ProgressDialog가 닫히지 않습니다. hide() 및 cancel() 메서드도 시도했지만 아무 것도 작동하지 않습니다. 누군가 나를 도울 수 있습니까? 안드로이드 버전은 여기해제, 숨기기 또는 취소를 실행 한 후에 ProgressDialog가 사라지지 않습니까?

2.2 코드입니다 :

public class LODOverlay extends Overlay implements OnClickListener { 



private Dialog overlayDialog; 

private ProgressDialog progressDialog; 

     .............. 


@Override 
public void onClick(View view) { 

        ....... 

     final Context ctx = view.getContext(); 
     this.progressDialog = new ProgressDialog(ctx); 
     ListView lv = new ListView(ctx); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(ctx, R.layout.layerlist, names); 
     lv.setAdapter(adapter); 
     final LODOverlay obj = this; 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
       String name = ((TextView) view).getText().toString(); 
     Intent getFloorIntent = new Intent(Map.RENDERER); 
     getFloorIntent.putExtra("type", "onGetBuildingLayer"); 
     getFloorIntent.putExtra("id", name); 
     view.getContext().sendBroadcast(getFloorIntent); 
     overlayDialog.dismiss(); 

     obj.waitingForLayer = name; 

     progressDialog.show(ctx, "Loading...", "Wait!!!"); 


      } 
     }); 

    ....... 
} 


public void buildingLoaded(String id) { 
    if (null != this.progressDialog) { 
     if (id.equals(this.waitingForLayer)) { 
      this.progressDialog.hide(); 
      this.progressDialog.dismiss(); 

    ............ 

      Map.flipper.showNext(); // changes the view 
     } 
    } 
} 

}

+0

overlayDialog를 만들거나 표시하는 위치를 표시하지 않습니다. overlayDialog가 동일한 대화 상자를 참조하고 있습니까? – Falmarri

+0

스레딩에 대해 약간 모호합니다. 백그라운드 작업을 시작할 때 AsyncTask를 사용하고 있습니까? 'buildingLoaded'가 호출 된 AsyncTask는 있습니까? 그건 효과가 없을거야. –

+0

overlayDialog가 정상적으로 작동합니다. progressDialog가 문제입니다. – Martin

답변

6

이 문제의 원인인지 확실하지,하지만 당신은 ProgressDialog에 전화하는 방법은 static이지만, 클래스의 인스턴스에서 호출하고 있습니다. 여기 메서드 정의는 다음과 같습니다 당신이 볼 수 있듯이

public static ProgressDialog show (Context context, CharSequence title, CharSequence message) 

ProgressDialog을 반환 방법은,이 클래스의 인스턴스에 show 작업을 수행하지 않습니다. 이들 중 하나를 사용하도록 코드를 업데이트 :

progressDialog.setTitle("Loading..."); 
progressDialog.setMessage("Wait!!!"); 
progressDialog.show(); 

또는

progressDialog = ProgressDialog.show(ctx, "Loading...", "Wait!!!"); 
+0

대단히 감사합니다 !!! 완벽한 !!! – Martin

2

ProgressDialog.show (...) 방법이 사실을 반환하기 전에 대화 상자에 표시()를 수행 않습니다. 다음은 Android.jar 출처입니다.

public static ProgressDialog show(Context context, CharSequence title, 
     CharSequence message, boolean indeterminate, 
     boolean cancelable, OnCancelListener cancelListener) { 
    ProgressDialog dialog = new ProgressDialog(context); 
    dialog.setTitle(title); 
    dialog.setMessage(message); 
    dialog.setIndeterminate(indeterminate); 
    dialog.setCancelable(cancelable); 
    dialog.setOnCancelListener(cancelListener); 
    dialog.show(); 
    return dialog; 
} 

이 방법의 모든 과부하는이 정보를 참조하십시오.

관련 문제