【问题标题】:Android: AsyncTask ProgressDialog will not open in ActivityGroupAndroid:AsyncTask ProgressDialog 不会在 ActivityGroup 中打开
【发布时间】:2023-03-27 19:13:01
【问题描述】:

我试图在轮询我的服务器时打开一个进度对话框。该类是一个 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)的示例应用程序,它工作得很好。

有谁知道如何修改它以使其工作,或者解决方法可以让进度条嵌套在标签栏中?非常感谢任何帮助。

【问题讨论】:

    标签: android android-asynctask progressdialog activitygroup


    【解决方案1】:

    如果 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());
    

    【讨论】:

      【解决方案2】:

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

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

      它非常适合我。

      【讨论】:

        【解决方案3】:

        如果 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); 
        

        它就像一个魅力。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-24
          • 1970-01-01
          相关资源
          最近更新 更多