14

我试图在轮询我的服务器时打开一个进度对话框。该类是一个 ActivityGroup,因为它嵌套在选项卡栏中。要将视图保持在框架内,需要 ActivityGroup。这是我的 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();
        }

当我运行给定的应用程序时,它会遇到与 WindowManager$BadTokenException 相关的错误。说明它无法使用未知令牌启动窗口。我尝试制作一个只是常规 Activity(不是 ActivityGroup)的示例应用程序,它工作得很好。

有谁知道如何修改它以使其工作,或者一个允许进度条嵌套在标签栏中的解决方法?任何帮助是极大的赞赏。

4

3 回答 3

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());
于 2010-12-03T14:43:06.137 回答
3

简单这里你也可以使用以下

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

它非常适合我。

于 2012-12-21T11:38:40.057 回答
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); 

它就像一个魅力。

于 2012-04-09T05:22:35.423 回答