关于dialog的一些

来源:互联网 发布:html宣传源码 编辑:程序博客网 时间:2024/06/10 22:47
1.Theme主题中设置了背景的默认阴暗度
 <item name="backgroundDimAmount">0.6</item>
但是没有设置如下属性
item name="android:backgroundDimEnabled">true</item>

所以系统在setContentView后首先会遍历主题的属性,默认的主题没有该属性

if (a.getBoolean(com.android.internal.R.styleable.Window_backgroundDimEnabled,                mIsFloating)) {            /* All dialogs should have the window dimmed */            if ((getForcedWindowFlags()&WindowManager.LayoutParams.FLAG_DIM_BEHIND) == 0) {                params.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;            }            if (!haveDimAmount()) {                params.dimAmount = a.getFloat(                        android.R.styleable.Window_backgroundDimAmount, 0.5f);            }        }
如果没有设置Window_backgroundDimEnabled属性就使用mIsFloating的值,而默认Theme主题中默认没有设置属性,所以mIsFloating为false,

 mIsFloating = a.getBoolean(com.android.internal.R.styleable.Window_windowIsFloating, false);        int flagsToUpdate = (FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR)                & (~getForcedWindowFlags());        if (mIsFloating) {            setLayout(WRAP_CONTENT, WRAP_CONTENT);            setFlags(0, flagsToUpdate);        } else {            setFlags(FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR, flagsToUpdate);        }
所以,Window_backgroundDimEnabled就会使用mIsFloating的false,所以如下代码将不会进去:

if (a.getBoolean(com.android.internal.R.styleable.Window_backgroundDimEnabled,                mIsFloating)) {            /* All dialogs should have the window dimmed */            if ((getForcedWindowFlags()&WindowManager.LayoutParams.FLAG_DIM_BEHIND) == 0) {                params.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;            }            if (!haveDimAmount()) {                params.dimAmount = a.getFloat(                        android.R.styleable.Window_backgroundDimAmount, 0.5f);            }        }
就设置不了 params.dimAmount。所以activity设置了Theme主题是不会显示阴暗度的,而dialog设置了Theme.Dialog主题后是有阴暗度的,如下

 <style name="Theme.Dialog">        <item name="windowFrame">@null</item>        <item name="windowTitleStyle">@style/DialogWindowTitle</item>        <item name="windowBackground">@drawable/panel_background</item>        <item name="windowIsFloating">true</item>

所以dialog有0.6的阴暗度。


2.Dialog的window属性

window属性宽高都设置match后,外面就不能点击了,因为外面已经没有点击区域了,且不能在外面控制布局里控件的位置,需要在布局里就控制好位置

window属性宽高都设置wrap后,即使layout的跟布局是match,且里面的控件是match,运行后控件显示出来都是和wrap的效果是一样的,dialog的内容只有wrap大小,一定要自己设置里面控件的固定大小(比如固定的200dp),并且这种情况下,外面如果有空余的位置,是可以设置点击使dialog消失的

<item name="android:windowBackground">@color/red_normal</item>
这个设置的是dialog的DecorView的背景,是真正意义上的根布局

<item name="android:backgroundDimEnabled">true</item>        <item name="android:backgroundDimAmount">0.7</item>
 <item name="windowIsFloating">true</item>
以上两种都是设置DecorView后面的阴暗度,层次在DecorView下面。

3.一般情况下使用以下两种style就可以满足需求

 <!-- 使用默认的黑暗程度0.6 -->    <style name="dialog" parent="@android:style/Theme.Dialog">        <item name="android:windowNoTitle">true</item>        <!-- 无标题,设置的是decorview的背景色 -->        <item name="android:windowBackground">@android:color/transparent</item>    </style>    <!-- 可以自己调整阴影度 -->    <style name="dim_dialog" parent="@android:style/Theme.Dialog">        <item name="android:windowNoTitle">true</item>        <!-- 无标题 -->        <item name="android:windowBackground">@android:color/transparent</item>        <!-- 默认是有阴影背景的,加以下属性可以改变阴影度阴影 -->        <item name="android:backgroundDimEnabled">true</item>        <item name="android:backgroundDimAmount">0.7</item>    </style>





0 0
原创粉丝点击