Dialog定制
定制dialog的方式
1. 可以通过Theme的方式,android默认也提供了一些Window的Theme来给我们使用,如:android.R.style.Theme_NoTitleBar(不显示title bar),android.R.style.Theme_NoTitleBar_Fullscreen(全屏)。
2. 通过设置Window类的一些属性来定制
如果要看源码的话,涉及到的一些类和xml文件:
android.view.Window
android.view.WindowManager (Window的属性管理类,而不是Window管理类)
android.view.WindowManager.LayoutParams (Window的所有可设置属性)
android.view.ViewGroup.LayoutParams (WindowManager.LayoutParams继承自该类)
com.android.internal.policy.impl.MidWindow (Dialog使用的Window实现类, Activity的Window实现类是PhoneWindow)
/res/style/themes.xml (在style name="Theme"下的那些item,大部分会被Window实现类读取,如:MidWindow的generateLayout方法会读取Window_windowIsFloating, Window_windowNoTitle等)
/res/layout/dialog_custom_title.xml
/res/layout/dialog_title_icons.xml
/res/layout/dialog_title.xml
在Dialog之外点击时隐藏Dialog
在任意未知显示Dialog
对Dialog的理解
Dialog的显示和dismiss实际上就是将dialog的DecorView从WindowManager添加和移除的过程
// show方法还使用了lazy initial的方式。在真正显示时,才inflater布局(通过dispatchOnCreate方法)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 {// 将DecorView添加到WindowManagermWindowManager.addView(mDecor, l);mShowing = true;sendShowMessage();} finally {}}