美文网首页
组件---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>
    

    相关文章

      网友评论

          本文标题:组件---Dialog

          本文链接:https://www.haomeiwen.com/subject/shglmftx.html