Android:在ActivityGroup中AsyncTask ProgressDialog无法打开

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)的示例应用程序,并且它可以正常工作。是否有人知道如何修改才能使其工作,或者有一种解决方法可以允许进度条嵌套在选项卡栏中?非常感谢任何帮助。
3个回答

22

如果ActivityGroup在TabActivity中,则您具有超过两个级别的嵌套活动。目前,Android不支持此功能,但有一个解决方法。您必须将父Activity传递给对话框。

在活动类中创建一个辅助方法以实现此目的:

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

然后更改这一行

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

3

在这里,你也可以使用以下内容

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

对我而言,IT技术运行完美。


1
如果getParent()对您不起作用,请尝试仅使用TabsActivity.context(或替换父选项卡活动类的名称)。我正在使用嵌套活动,因此使用getParent()仍然无法返回对话框的正确上下文,因为它需要扩展TabsActivity的活动的上下文,而不是直接父级的上下文。
简单修复:
1. 您需要在TabsActivity类中创建一个上下文变量。例如public static TabsActivity context;context = this在onCreate方法中。 2. 用以下内容替换创建对话框的行:AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new AlertDialog.Builder(TabsActivity.context); 

它运行得非常好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接