在同一个窗口中,可以同时有多个AlertDialog,但是他们之间相互覆盖,最后show()的那个在最上面,Why?
代码如下:
new AlertDialog.Builder(SpinnerTestActivity.this).setTitle("One").setMessage("one") .setNegativeButton("button", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialoginterface, int i){ } }).show(); new AlertDialog.Builder(SpinnerTestActivity.this).setTitle("TWO").setMessage("Two") .setNegativeButton("button", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialoginterface, int j){ } }).show();
public void show() { if (mShowing) { if (mDecor != null) { mDecor.setVisibility(View.VISIBLE); } return; } if (!mCreated) { dispatchOnCreate(null); } onStart(); mDecor = mWindow.getDecorView(); WindowManager.LayoutParams l = mWindow.getAttributes(); if ((l.softInputMode & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) { WindowManager.LayoutParams nl = new WindowManager.LayoutParams(); nl.copyFrom(l); nl.softInputMode |= WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION; l = nl; } try { mWindowManager.addView(mDecor, l); mShowing = true; sendShowMessage(); } finally { } }
其中 mWindow 是在 构造函数 public Dialog(Context context, int theme) 中初始化 :
Window w = PolicyManager.makeNewWindow(mContext);
mWindow = w;
由此,在上面的show()代码中,将从mWindow中的decorView加入到 原窗口中,覆盖了原窗口中的decorView的显示。
本程序中,最后的显示的窗口中,具有3个decorView(两个存放Dialog, 一个存放原布局):mWindowManager - > mWindowManager - > mViews
========================================================================================================================
在Hierarchy Viewer中,原先的窗口显示的布局是:
其布局无关精要,主要有一个TextView,一个Spinner,一个 Button
show了AlertDialog之后,其布局为:
不难看出,原decorView被覆盖了,显示的是第二个Dialog