Android-android 如何关于弹出全局dialog?

需求定制 需求定制 主题:1050 回复:2283

Android-android 如何关于弹出全局dialog?

晚风撩人 发布于 2017-08-03 字数 529 浏览 1704 回复 4

我们一般使用的是普通的AlertDialog,就是new AlertDialog.Builder(context), 传进去的那个context必须是一个Activity,然后作为该提示框的父Activity,只有当父Activity在最前时,AlertDialog才会显示出来,有没有什么办法可以让AlertDialog无论但当前在哪个Activity,都能马上弹出来并显示在最前面呢?

自己也了解了一下,更准确的来说应该是需要一个context,本来想在Service里面去弹出dialog
可是发现必定会抛异常:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(4

夜无邪 2017-10-26 4 楼

行吧,自己思考下。。。 弹出弹出dialog 的本质在于 基于的activity ,于是手动建立了一个activity 的栈,每次打开有activity 打开或关闭的时候就做 push ,pull的处理,需要构建对话框的时候,就取出位于站定的元素,用于构建,这样就没有问题了。 试了下,理论上能解决我的问题了,不过这样做还会引发什么不良的反应吗?

甜柠檬 2017-08-24 3 楼

自己也了解了一下,更准确的来说应该是需要一个context,本来想在Service里面去弹出dialog
可是发现必定会抛异常:

这个假设是不成立的.
你想在界面上添加一个窗口,但是这个窗口不想依附任何一个activity,这时候只有考虑WindowManager,他的父类ViewManager有这么一个[函数][3]:
addView(View view, ViewGroup.LayoutParams params)
看到这里,我想你应该能解决你的问题了。

[3]: http://developer.android.com/reference/android/view/ViewManager.html#addView(android.view.View, android.view.ViewGroup.LayoutParams)

浮生未歇 2017-08-10 2 楼

不好意思,一开始没看完全问题,请忽略一二...
(为什么不用activity呢~?
activity可以设置成diaolog样式,长得跟dialog差不多了~
第二种方法是,先启动一个透明的activity,然后在这个activity上弹出dialog,返回退出dialog的时候同时推出activity。)

第三种方法是,直接在windowManager上添加view

wm = (WindowManager) getApplicationContext().getSystemService("window");
WindowManager.LayoutParams para = new WindowManager.LayoutParams();
para.height = -1;
para.width = -1;
para.format = 1;

para.flags = LayoutParams.FLAG_FULLSCREEN | LayoutParams.FLAG_LAYOUT_IN_SCREEN;

para.type = LayoutParams.TYPE_SYSTEM_ALERT;
mView = LayoutInflater.from(context).inflate(
                R.layout.layout_my_dialog, null);
wm.addView(mView, para);

其中的para参数可以根据自己的需要重新修改,现有的参数是要全屏、并且屏蔽各种按键
其中的mView就是你的对话框了~
但是这样出来的东西~要用wm.removeView才能去掉

晚风撩人 2017-08-05 1 楼

service的context是没有window的,所以不能弹出一个dialog。

根据这样的情况,可以参考下使用静态方法去封装这个dialog,类似于:

 public static Dialog createDialog(Context context, int dlgID, Bundle args){
AlertDialog.Builder builder = new AlertDialog.Builder(context);
...
return builder.create();
}

或者干脆封装出一个dialog工厂类出来,根据传入的context构建dialog