PopupWindow Dialog AlertView区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26464451/article/details/82149436

PopupWindow、Dialog、AlertView
首先说明一下,AlertView 是一个第三方框架,是一个仿IOS弹出框的三方框架,很好用。
此次项目在一个界面的显示上遇到一个需求问题。首先我是将popupwindow底部显示,然后点击popupwindow上面的某一个控件再弹出一个提示框出来。
开始的时候,我在将popupwindow显示出来之后,再点击显示AlertView控件,然而现象却不如我所想的那般,popupwindow盖住了alertview,AlertView并没有在popupwindow的上层显示出来(注意此处我用的是上层,不是上方)。我百思不得其解,我alertView是在当前页面上显示的,也是通过popupwindow点击才显示出来的,为什么效果是这样的。
一时间也没有头绪,然后我尝试的使用popupwindow点击显示dialog,然后效果出来了,dialogi显示在popupwindow的中上层,没有被盖住。需求的问题解决了,但是我的疑惑还没有解决AlertView 和Dialog实现的都是同样的效果,为什么显示的效果却又这么大的区别。只有找源码了。
首先:Dialog:在Dialog的构造方法中是这样写的
….//省略一部分
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
final Window w = new PhoneWindow(mContext);
mWindow = w;
w.setCallback(this);
w.setOnWindowDismissedCallback(this);
w.setOnWindowSwipeDismissedCallback(() -> {
if (mCancelable) {
cancel();
}
});
w.setWindowManager(mWindowManager, null, null);
w.setGravity(Gravity.CENTER);
……//省略
看起初没有,在构造方法中这里是重新new了一个新的PhoneWindow对象,然后我们点到setWindowManager方法中去
….//省略
if (wm == null) {
wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
}
mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);
…//省略
这里就是重点了,这里重新创建了一个WindowManager
然后我们再转到dialog的show()方法中去:
../省略
WindowManager.LayoutParams l = mWindow.getAttributes();
boolean restoreSoftInputMode = false;
if ((l.softInputMode
& WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
l.softInputMode |=
WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
restoreSoftInputMode = true;
}
mWindowManager.addView(mDecor, l);
../省略
重点就在这里:这里将dialog的内容是添加到了这个新创建的windowManger中去的,也就是说和之前加载主界面的并不是同一个windowManager.他是加在上层的一个新的PhoneWindow对象.
然后AlertView:
这个就更简单了,这个view他就是获取当前界面的decorView,然后将自己layout通过布局管理器转换成view,添加到decoreView中去显示。看源码:
首先initViews:
LayoutInflater layoutInflater = LayoutInflater.from(context);
decorView = (ViewGroup)((Activity)context).getWindow().getDecorView().findViewById(android.R.id.content);//顶尖view
rootView = (ViewGroup) layoutInflater.inflate(R.layout.layout_alertview, decorView, false);//这个就是我们自己新建的布局
然后再看show:
/**
* 添加这个View到Activity的根视图
*/
public void show() {
if (isShowing()) {
return;
}
onAttached(rootView);
}
//其实注释都写好了,将这个rootView 添加到Activity的根视图(在onAttached)中实现。

结语:具体看到这里我就明白了为什么Dialog和AlertView 在popupwindow中显示的效果不一样。
如果只是普通的显示在activity中或者fragment中二者的实现效果都一样,但是在popupwindow中,alertView 只是将显示的布局添加到这个界面的跟布局上,而dialog则是新new了一个PhoneWindow,然后将新的一层显示出来,这就是alertView会被覆盖,而dialog会显示在上层。
PopupWindow是默认显示在所依赖界面的最上方.

猜你喜欢

转载自blog.csdn.net/qq_26464451/article/details/82149436