不依赖Activity、Dialog显示View方法
发布网友
发布时间:2023-04-26 02:11
我来回答
共1个回答
热心网友
时间:2023-10-17 15:47
一、首先我们先看下Activity是如何显示View
平常我们在Activity的onCreate会调用setContentView(R.layout.xxx),Activity启动过程与window的源码流程可参考
Activity Window WMS的源码关系流程介绍
总结几个步骤:
1、创建Activity:ActivityThread的performLaunchActivity函数中创建Activity后,调用Activity.attach函数
2、创建PhoneWindow:Activity.attach函数中创建与之关联的PhoneWindow,PhoneWindow会创建DectorView。
3、添加视图:setContentView添加到PhoneWindow的DectorView中
4、关联PhoneWindow到WMS中:ActivityThread实行完performLaunchActivity,会handleResumeActivity,走到Activity的onResume,然后设置Activity的PhoneWindow的type类型:
PhoneWindow会创建DectorView,通过WindowManagerImpl-->WindowManagerGlobal-->ViewRootImpl-->(binder)WMS中的Session的addToDisplay函数,这样视图就会显示出来。
我们看下l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
WindowManager.java:
从英文翻译来看,这个type是应用程序的window类型。
二、Dialog显示View:
我们顺着alertDialog.show():
其中final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);
super是Dialog,接着看Dialog的构造函数:
这边会创建Dialog的PhoneWindow,我们看PhoneWindow的构造函数
父类Window的
看WindowManager.LayoutParams:
这个type的默认window类型是TYPE_APPLICATION:
这个Dialog的window就需要依赖Activity来显示了。
三、直接使用系统级的Window类型,来添加View:
这个context上下文可以是service、application的。
其中layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
这是系统级的window
如何让一个AlertDialog不受activity的影响
你可以在另外一个activity的oncreate中显示相同的一个dialog,如果有数据,把数据传递过来。但是界面可能会闪一下。
Android 全局弹窗(Dialog)快速实现
我采用 集合法 来实现的退出登录 ,在BaseActivity中记录所有打开过的Activity,然后遍历清除。然后在 BaseActivity 中调用 addActivity() ,不在赘述!如果能获取到用户当前观看的界面,然后将上下文传过去,就可以实现全局Dialog 当前页面也就是栈顶Activity,也就是最后添加的那个Activity。如下:然后在使用的...
...能实现这个功能,就是弹出的时候还可以操作原来的activity view...
可以用popupWindow来实现 popupWindow.setFocusable(true);popupWindow.setAnimationStyle(android.R.style.Animation_Dialog);popupWindow.setBackgroundDrawable(new BitmapDrawable());popupWindow.setOutsideTouchable(true);加上这几句话就可以了 ,跟dialog有相同的效果 Dialog也可以实现,但是我没有研究,你可以...
非Activity的类中,怎么才能调用AlertDialog
在非Activity的类中,我打算在catch捕捉到错误后,用AlertDialog显示出来,但是无法填写context参数;另外由于这段函数不能返回到调用其Activity的类中,所以现在有点想不出怎么解决好了 ---解决思路--- 可以把context传进去 ---解决思路--- 你这个写一个带Context的构造方法。
Android Dialog如何显示在空间的下面
PopupWindow 是一个可以显示在当前 Activity 之上的浮动容器,PopupWindow 弹出的位置是能够改变的,按照有无偏移量,可以分为无偏移和有偏移两种;按照参照对象的不同又可以分为两种:相对某个控件(Anchor 锚点)的位置和在父容器内部的相对位置。LayoutInflater mLayoutInflater = (LayoutInflater) context.get...
怎么使dialog失去焦点而不消失,activity获得焦点
不可以 dialog的机制就是当dialog出现的时候 当前活动的焦点会被掠夺
android dialog 怎么设置全屏
默认的Dialog是不能全屏的。也就是怎么设置Dialog的Layout都没用的。面给出实现Dialog实现全屏的两种方式:1、代码实现。这中方法相对比较简单 首先继承Dialig,然后再构造函数中添加 super(context, android.R.style.Theme);setOwnerActivity((Activity)context);2、XML实现 首先,在values文件中添加一个...
可以透过NDK弹出对话框Dialog吗
传入主activity的content就行了,用activity弹出就可以了吧。如果要用同一对话框窗口,就改写dialog的view,使得其有下一页
Dialog与PopWindow的区别
默认情况下是不能够在onCreate时显示;所以如果想要在界面显示的时候就弹出PopupWindow 需要重写onWindowFocusChanged方法,判断activity完全显示,并且已经拿到焦点,此时 才能进行显示;否则会报出异常:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is ...
dialog 启动 fragment 怎么处理???
是不是可以这样写,把fragment加在viewpager 上面 。然后 比如说我在viewpager页面1 的时候对应的是fragment1 我想通过这个dialog 上面的按钮跳到 fragment3 也就是viewpager3 的话 ,是不是可以直接设置viewPager.setCurrentItem(3);如果是不同的activity 的话 用intent 传一个值过去,接到的时候在...