Dialog常用于activity或fragment页面上的弹框视图的展示控件。还有一种弹框控件叫popuwindow。二者最重要的区别:dialog是非线程阻塞的,popuwindow是线程阻塞的。前者在展示的时候所附属的activity或fragment仍能进行未完成的动作,而popuwindow一旦弹出将会阻塞主线程,即所附属的界面在他之后的活动将不再进行。当然popuwindow使用起来更加灵活。这也是他的一大好处,针对popuwindow的知识后期来一个总结。
在我们平时的安卓开发中dialog最常用的是AlertDialog。后者是对前者的一个补充和封装,AlertDialog所有的方法都是采用静态的模式,并且方法多样,用起来更加方便和快速。
自定义Dialog:
对话框最主要的是弹出一个层,与附属的父窗口脱离,让用户一目了然。但是系统的对话框预设格式比较简单,有时候我们需要一些在对话上的一些操作,例如分享盘、更新对话框、签到对话框等等,这时候我们就要对系统的对话框进行扩展,来达到我们的目的。
最常用的就是自定义一个布局,然后用dialog进行包装,同时按照需求对dialog的样式进行一些修改。
View view0 = getLayoutInflater().inflate(R.layout.dialog_persion_sex, null);
new AlertDialog.Builder(PersionActivity.this)
.setView(view0)
.show();
这只是最简单的引用自定义的布局结合dialog的弹框形成一个自定义对话框,有些同学看到这一点就手舞足蹈了,想着既然能引用自己的布局那我想怎么布局就怎么布局,我想设什么样的背景就设什么样的背景,这样的说法其实是错误的。我们查看dialog的源码知道所有的系统dialog都是一种样式。细心的同学会发现有些时候我们本来想在对话框上设置一个不规则的png背景图片,可总是背景是白色的,甚至我们将自定义布局的背景也设成透明也不行。深入dialog的源码查看其样式知道它是在爷爷级的window窗口下设置了一个背景,以及其他设定。原样式:
<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>
<item name="windowContentOverlay">@null</item>
<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="DialogBackgroundNull" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item> <!--无边框-->
<item name="android:windowIsFloating">true</item><!--悬浮在父界面之上-->
<item name="android:windowIsTranslucent">true</item><!--允许呈现半透明状态-->
<item name="android:windowNoTitle">true</item><!--无标题-->
<item name="android:windowBackground">@color/trans_color</item> <!--透明背景-->
<item name="android:backgroundDimEnabled">true</item> <!-- 允许周围模糊 -->
<item name="android:backgroundDimAmount">0.6</item><!--设置模糊灰度-->
</style>
然后在填充自定义布局的时候将此样式也设置上就能实现无背景而又任意不规则背景的展现了。
View view = getLayoutInflater().inflate(R.layout.dialog_my_sign,null);
Dialog dialog = new Dialog(mActivity, R.style.DialogBackgroundNull);
Window window = dialog.getWindow();
window.setContentView(view);
dialog.show();