美文网首页
组件---Dialog

组件---Dialog

作者: 烧饼正努力 | 来源:发表于2018-07-28 17:07 被阅读12次

什么是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>

相关文章