2

由于后台 http 操作,我必须在前台活动中显示一个对话框。

当对话框必须出现时,它可能无处不在,上下文可以改变,例如我已经开始了一个新的活动。

如果我使用 applicationContext 来显示我得到的对话框:

05-04 17:32:32.560: E/AndroidRuntime(3663): android.view.WindowManager$BadTokenException: 无法添加窗口 -- 令牌 null 不适用于应用程序

所以...我怎样才能实现我的目标?

有什么建议么?

4

4 回答 4

2

无论何时/何地创建对话框,您都将处于活动中,对吗?为什么不直接使用那个活动作为上下文呢?

在我自己的代码中,我创建了一个帮助类,它为我创建了一个对话框。在那个助手类中,我传入当前的活动、标题和消息。它构造对话框并返回我可以管理的 AlertDialog 对象。

您可以尝试这样做,但您仍然需要知道您希望对话框显示的上下文/活动。

于 2012-05-04T15:53:51.483 回答
0

在我看来,最好的方法是创建一个新活动并像对话一样使用它。步骤:

  1. 创建新的活动,例如(原始的)MainActivy。

  2. 根据需要填写相关的activity_main.xml。

  3. 在您的 AndroidManifest.xml 中重新编写此行。

    <activity
            android:theme="@style/AppTheme.Dialog"
            android:name="com.myapp.original.example"
            android:label="@string/timy_titlle" >
    
  4. 使用 Intent 类从其他活动中调用您的 MainActivity,现在已转换为 Dialog。

如果您使用的是 Action Bar Compact,您可以按照其他步骤操作。

于 2014-04-02T21:34:35.060 回答
0

您需要一种方法来通知您的前台Activity 操作已完成,您可以通过注册一个监听器来做到这一点,因为您没有发布任何代码,我将做出假设。

有两种方法可以通知我知道的前台 Activity,第一种方法是使用广播意图,这里有一个与它们有关的问题Android BroadcastReceiver 中的 Activity。您可以从后台操作中触发广播意图并将您的活动注册为接收器。

见这里http://developer.android.com/reference/android/content/Context.html#sendOrderedBroadcast%28android.content.Intent,%20java.lang.String,%20android.content.BroadcastReceiver,%20android.os.Handler ,%20int,%20java.lang.String,%20android.os.Bundle%29和这里 http://developer.android.com/reference/android/content/BroadcastReceiver.html

第二种方法是向您的类注册一个执行后台操作的侦听器,例如(伪代码)

@Override
protected void onResume() {
    BackgroundOperator.registerListener(this);
}

@Override
protected void onPause() {
    BackgroundOperator.unregisterListener(this);
}

public void onOperationComplete(...) {
    // TODO: Show your dialog here
}

您的侦听器可能是这样的(您的 Activity 可以实现):

interface BackgroundOperatorListener {
    void onOperationComplete(...);
}

这里的想法是您的前台活动将是当前注册的侦听器,因此它将是 onOperationComplete(...) 回调的接收者,然后您可以显示您的对话框,... 可以是要传递的任意数量的参数操作完成后到您的活动。

于 2012-05-04T15:59:34.597 回答
0

我认为您需要的是获取任务的顶级活动(当前显示活动),然后使用它来显示对话框。

所以看到这个线程:如何获取最顶层活动的任何标识符?

编辑:从后台显示对话框不是很好的用户体验,您可以发送通知或只是长时间祝酒。

于 2012-05-04T16:00:56.873 回答