由于后台http操作,我必须在前台活动中显示一个Dialog。
当对话必须出现时,它可能无处不在,上下文可以改变,例如我已经开始了一个新的活动。
如果我使用applicationContext来显示我得到的对话框:
05-04 17:32:32.560:E / AndroidRuntime(3663): android.view.WindowManager $ BadTokenException:无法添加窗口 - token null不适用于应用程序
所以...我怎样才能实现目标?
有什么建议吗?
答案 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)
在我看来,最好的方法是创建一个新活动并像对话一样使用它。 步骤:
创建新活动,例如(原创)MainActivy。
根据需要填写activity_main.xml。
在你的AndroidManifest.xml中重写这行。
<activity
android:theme="@style/AppTheme.Dialog"
android:name="com.myapp.original.example"
android:label="@string/timy_titlle" >
使用Intent类从其他活动中调用现在转换为Dialog的MainActivity。
如果您使用的是Action Bar Compact,则可以关注this others steps。