如果我不知道当前的上下文,到处显示Dialog?

时间:2012-05-04 15:45:35

标签: android dialog android-context

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

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

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

  

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

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

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

无论何时/何地您创建对话,您都会参加活动吗?为什么不直接将该活动用作上下文?

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

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

答案 1 :(得分:0)

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

有两种方法可以通知我所知道的前景活动,第一种方式是使用广播意图,这里有一个与他们有关的问题Android BroadcastReceiver within 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
}

你的听众可能是这样的(你的活动可以实现):

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

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

答案 2 :(得分:0)

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

所以请看这个主题:How to get any identifier of the topmost activity?

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

答案 3 :(得分: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类从其他活动中调用现在转换为Dialog的MainActivity。

  5. 如果您使用的是Action Bar Compact,则可以关注this others steps