2010-12-01 51 views
14

我想在查詢我的服務器時打開進度對話框。該類是一個ActivityGroup,因爲它嵌套在標籤欄中。爲了將視圖保留在框架內,需要ActivityGroup。這裏是我的ActivityGroup類的聲明:Android:AsyncTask ProgressDialog不會在ActivityGroup中打開

public class CheckInActivity extends ActivityGroup{ 
     ... 
     public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.checkin); 
      new LocationControl().execute(this); 

現在我的AsyncTask類相同CheckInActivityClass內,例如:

private class LocationControl extends AsyncTask<Context, Void, Void> 
    { 
     private final ProgressDialog dialog = new ProgressDialog(CheckInActivity.this); 

     protected void onPreExecute() 
     { 
      this.dialog.setMessage("Determining your location..."); 
      this.dialog.show(); 
     } 

當我運行給定應用,它得來與窗口管理器$ BadTokenException錯誤。說明它不能用未知的標記開啓窗口。我試着製作一個只是普通Activity(而不是ActivityGroup)的示例應用程序,它工作得很好。

有誰知道如何修改它使其工作,或解決方法將允許進度欄嵌套在標籤欄?任何幫助是極大的讚賞。

回答

22

如果ActivityGroup在TabActivity中,則您的嵌套活動具有多於兩個級別。目前Android不支持此功能,但有一個解決方法。您必須將父級活動傳遞給對話框。

創建用於此目的的活動類的輔助方法:

private Context getDialogContext() { 
    Context context; 
    if (getParent() != null) context = getParent(); 
    else context = this; 
    return context; 
} 

然後換行

private final ProgressDialog dialog = new ProgressDialog(CheckInActivity.this); 

private final ProgressDialog dialog = new ProgressDialog(getDialogContext()); 
1

如果的getParent()不工作對於你,請嘗試僅使用TabsActivity.context(或者替換你的父標籤活動類的名稱)。我使用嵌套的活動,因此使用getParent()仍然沒有返回對話框的正確上下文,因爲它需要擴展TabsActivity的活動的上下文,而不是直接的父級。

簡單的解決方法:

  1. 你需要在TabsActivity類來創建一個上下文變量。像onCreate方法中的public static TabsActivity context;context=this

  2. 替換這一行,你創建對話框:

    AlertDialog.Builder builder = new AlertDialog.Builder(this);

有了:

AlertDialog.Builder builder = new AlertDialog.Builder(TabsActivity.context); 

,它就像一個魅力。

3

簡單在這裏你還可以使用以下

private final ProgressDialog dialog = new ProgressDialog(getParent()); 

它完美地爲我工作。