什么是Dialog:
dialog是在当前界面弹出的一个小窗口,用于显示重要提示信息。
生命周期:
生命周期方法:
show(),onCreate(),onStart() ,cancel(),dismiss(),onStop() 。
- Dialog仅在在第一次启动时候会执行onCreate()方法(之后无论该Dialog执行dismiss(),cancel(),onStop(),Dialog都不会再执行onCreate()方法)。
- show() 和 onStart()在每次Dialog显示时都会依次执行。
- dismiss() 和 onStop() 在每次Dialog消失的时候都会依次执行。
- cancel() 是在点击BACK按钮或者Dialog外部时触发,然后依次执行dismiss() 和 onStop()。
生命周期流程实例:
- 点击显示按钮,第一次显示Dialog,然后按BACK键返回。
onCreate() —> onStart()—> show();
onStop()—> dismiss() —> cancel(); - 再次点击显示按钮,然后点击Dialog外部。
onStart() —> show() ;
onStop()—> dismiss() —> cancel(); - 再次点击显示按钮,然后执行Dialog.dismiss() 方法。
show() —> onStart();
onStop() —> dismiss();
设置全屏效果:
布局文件中设置为match_parent也无法全屏的原因:
系统dialog的样式。默认有padding=10dip,所以即使设置为全屏,也是有10dip的间隙
查看源码:
<style name="Theme.Dialog">
......
<item name="listPreferredItemPaddingLeft">10dip</item>
<item name="listPreferredItemPaddingRight">10dip</item>
<item name="listPreferredItemPaddingStart">10dip</item>
<item name="listPreferredItemPaddingEnd">10dip</item>
......
</style>
主题中默认设置了padding
解决方法:
在window的onCreate方法中设置window中decorView的padding和window中的LayoutParams以及Gravity
Window win = getWindow();
if (win != null) {
win.getDecorView().setPadding(0, 0, 0, 0);
WindowManager.LayoutParams lp = win.getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
win.setAttributes(lp);
// dialog 布局位于中间
win.setGravity(Gravity.CENTER);
}
dialog中的属性:
- 设置背景模糊效果
- 设置出入时的动画效果
<style name="Theme.Dialog">
<!--Dialog的windowFrame框为无-->
<item name="windowFrame">@null</item>
<item name="windowTitleStyle">@style/DialogWindowTitle</item>
<!--设置dialog的背景,(#00000000)-->
<item name="windowBackground">@drawable/panel_background</item>
<!--是否浮现在activity之上-->
<item name="windowIsFloating">true</item>
<item name="windowContentOverlay">@null</item>
<!--Dialog进出的显示动画-->
<item name="windowAnimationStyle">@style/Animation.Dialog</item>
<item name="windowSoftInputMode">stateUnspecified|adjustPan</item>
<item name="windowCloseOnTouchOutside">@bool/config_closeDialogWhenTouchOutside</item>
<item name="windowActionModeOverlay">true</item>
<item name="colorBackgroundCacheHint">@null</item>
<item name="textAppearance">@style/TextAppearance</item>
<item name="textAppearanceInverse">@style/TextAppearance.Inverse</item>
<item name="textColorPrimary">@color/primary_text_dark</item>
<item name="textColorSecondary">@color/secondary_text_dark</item>
<item name="textColorTertiary">@color/tertiary_text_dark</item>
<item name="textColorPrimaryInverse">@color/primary_text_light</item>
<item name="textColorSecondaryInverse">@color/secondary_text_light</item>
<item name="textColorTertiaryInverse">@color/tertiary_text_light</item>
<item name="textColorPrimaryDisableOnly">@color/primary_text_dark_disable_only</item>
<item name="textColorPrimaryInverseDisableOnly">@color/primary_text_light_disable_only</item>
<item name="textColorPrimaryNoDisable">@color/primary_text_dark_nodisable</item>
<item name="textColorSecondaryNoDisable">@color/secondary_text_dark_nodisable</item>
<item name="textColorPrimaryInverseNoDisable">@color/primary_text_light_nodisable</item>
<item name="textColorSecondaryInverseNoDisable">@color/secondary_text_light_nodisable</item>
<item name="textColorHint">@color/hint_foreground_dark</item>
<item name="textColorHintInverse">@color/hint_foreground_light</item>
<item name="textColorSearchUrl">@color/search_url_text</item>
<item name="textAppearanceLarge">@style/TextAppearance.Large</item>
<item name="textAppearanceMedium">@style/TextAppearance.Medium</item>
<item name="textAppearanceSmall">@style/TextAppearance.Small</item>
<item name="textAppearanceLargeInverse">@style/TextAppearance.Large.Inverse</item>
<item name="textAppearanceMediumInverse">@style/TextAppearance.Medium.Inverse</item>
<item name="textAppearanceSmallInverse">@style/TextAppearance.Small.Inverse</item>
<item name="listPreferredItemPaddingLeft">10dip</item>
<item name="listPreferredItemPaddingRight">10dip</item>
<item name="listPreferredItemPaddingStart">10dip</item>
<item name="listPreferredItemPaddingEnd">10dip</item>
<item name="preferencePanelStyle">@style/PreferencePanel.Dialog</item>
</style>
<style name="Common_Dialog" parent="android:style/Theme.Dialog">
<item name="android:background">#00000000</item>
<!--是否半透明-->
<item name="android:windowIsTranslucent">false</item>
<!--就是用来控制灰度的值,当为1时,界面除了我们的dialog内容是高亮显示的,dialog以外的区域是黑色的,完全看不到其他内容,系统的默认值是0.5-->
<item name="android:backgroundDimAmount">0.5</item>
<!--显示区域以外是否使用黑色半透明背景-->
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowContentOverlay">@null</item>
<!--是否不显示title-->
<item name="android:windowNoTitle">true</item>
<!--显示区域背景是否透明,(#00000000)-->
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
</style>
网友评论