【问题标题】:Show Dialog everywhere if I don't know the current context?如果我不知道当前上下文,到处显示对话框?
【发布时间】:2012-05-04 15:45:35
【问题描述】:

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

当对话框必须出现时,它可能无处不在,可以更改上下文,例如我启动了一个新 Activity。

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

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

那么...我怎样才能实现我的目标?

有什么建议吗?

【问题讨论】:

标签: android dialog android-context


【解决方案1】:

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

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

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

【讨论】:

  • 不,我不能,因为当我在等待后台结果(使用处理程序)时,我可以开始一个新的活动来改变当前的上下文。前一个活动的处理程序能够在处理程序所在的活动(您的解决方案)中而不是在新的活动中显示对话框。
【解决方案2】:

你需要一种方式来通知你的前台Activity操作已经完成,你可以通过注册一个监听器来实现,由于你没有发布任何代码,我会做假设。

我知道有两种方法可以通知前台 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
}

你的监听器可能是这样的(你的 Activity 可以实现):

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

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

【讨论】:

  • 问题是......如何知道哪个是前台活动?
  • 好的,我已经更新了我的答案,以便在 onResume 和 onPause 中注册活动,这将确保只有前台活动从后台操作中获取回调,希望对您有所帮助。
  • 顺便说一句,如果您正在发出 Web 请求,我强烈建议您查看 Virgil Dobjanschi 的 Google IO REST 演示文稿youtube.com/watch?v=xHXn3Kg2IQE,他描述了一个类似的方法(关于他的 Service Helper 类)
【解决方案3】:

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

所以看到这个线程:How to get any identifier of the topmost activity?

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

【讨论】:

    【解决方案4】:

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

    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,您可以关注 this others steps

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多