1. Dialog 与 AlertDialog 的区别。

  AlertDialog 是一种特殊形式的 Dialog。这个类中,我们可以添加一个,两个或者三个按钮,可以设置标题。所以,当我们想使用 AlertDialog 默认的按钮形式,用 AlertDialog 更加方便,而且有一个类 AlertDialog.Builder 很方便创建一个 AlertDialog。

  

2. Dialog 与 AlertDialog 写代码时需注意的事项。

  我们可以给一个 Dialog 用自定义的 Layout。有两个位置可以设置 Layout。

  • 一个是结构体中
  • 一个是 onCreate 方法中

  如果使用 AlertDialog,在结构体中需要写

        View contentView = LayoutInflater.from(context).inflate(R.layout.cutomized_dialog, null);
setView(contentView);

  而不能直接写 setContentView(R.layout...); 这会导致错误:E/AndroidRuntime(4544): android.util.AndroidRuntimeException: requestFeature() must be called before adding content
  
  在 onCreate 里写的话,可以直接用 setContentView(R.layout...); 而不会导致错误。但是,这两种方法是有区别的!

如果写在结构体里,用的是 LayoutInflater,而真正的外壳依然是默认的 Dialog 的一个外壳。也就是有 Dialog 默认的标题,默认的背景颜色等。

但如果写在 onCreate 里,使用 setContentView(R.layout...); 这种情形下,Dialog 默认的 Layout 外壳就不存在了,而使用我们自定义的 Layout。比如你的 Layout 的背景颜色是透明,那么出来的 Dialog 的背景就是透明的。而写在结构体里的情况则背景色是系统 Dialog 默认的(黑或白一般)。而且这种方法下不可以再使用系统默认的标题栏了,因为它已经不存在了。所以如果你写上:

        TextView titleText = (TextView) findViewById(android.R.id.title);
titleText.setText("testtitle");

你会得到一个 NullPointer 。因为 android.R.id.title 这个 Layout 已经被覆盖。

  如果使用 Dialog,在结构体里,可以直接写 setContentView(R.layout.cutomized_dialog); 而不用 LayoutInflater。

  在 onCreate 里的话,也是一样,直接写 setContentView(R.layout.cutomized_dialog);

  也就是说,如果用的是 Dialog,两种方法写没有任何区别。都会使用默认的 Dialog 样式。如果想修改样式,则需给 Dialog 提供自定义的样式。

我曾经需要创建一个背景透明的 Dialog,可是不管我怎么改 style,都没有成功。最后解决方案是使用了 AlertDialog 然后在 onCreate 方法中使用自己的 Layout,并把它的背景设置为透明。

Dialog 透明效果成功。解决方案是给 Dialog 的背景设置为一个透明的图片。(有一篇文章可供参考,http://blog.csdn.net/sodino/article/details/5822147

<item name="android:windowBackground">@drawable/a_transparent_image</item>

详情看下面的 xml 文件。

3. 一些参数

getWindow().setDimAmount(0);

  这个函数用来设置 Dialog 周围的颜色。系统默认的是半透明的灰色。值设为0则为完全透明。

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="dialog" parent="@android:style/Theme.Dialog">
<!--边框-->
<item name="android:windowFrame">@null</item>
<!--是否浮现在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--半透明-->
<item name="android:windowIsTranslucent">false</item>
<!--无标题-->
<item name="android:windowNoTitle">true</item>
<!--背景透明这种方法不好使-->
<item name="android:windowBackground">@color/transparent</item>
<!--背景透明正确方法-->
<item name="android:windowBackground">@drawable/a_transparent_image</item>
<!--模糊-->
<item name="android:backgroundDimEnabled">false</item>
</style>
</resources><item name="android:windowBackground">@color/transparent</item>

Android Dialog 的一些特性的更多相关文章

  1. Android 5.X新特性之为RecyclerView添加下拉刷新和上拉加载及SwipeRefreshLayout实现原理

    RecyclerView已经写过两篇文章了,分别是Android 5.X新特性之RecyclerView基本解析及无限复用 和 Android 5.X新特性之为RecyclerView添加Header ...

  2. Android 5.X新特性之为RecyclerView添加HeaderView和FooterView

    上一节我们讲到了 Android 5.X新特性之RecyclerView基本解析及无限复用 相信大家也应该熟悉了RecyclerView的基本使用,这一节我们来学习下,为RecyclerView添加H ...

  3. Android Dialog使用举例

    在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一 ...

  4. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  5. Android 6.0 新特性 整理 资料来自网络

    Android 6.0新特性 Runtime Permissions Doze and App Standby Apache HTTP Client Removal BoringSSL Access ...

  6. 腾讯云安全:开发者必看|Android 8.0 新特性及开发指南

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 A ...

  7. Android 8.0 新特性

    Android 8.0 (Android Oreo(奥利奥))新特性介绍 通知渠道 - Notification Channels 通知渠道是由应用自行定义的通知内容类别,借助渠道,开发者可以让用户对 ...

  8. 开发者必看|Android 8.0 新特性及开发指南

    背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 Android 系统,今年为 Android 8.0.谷歌在今年3 月21日发布 Andro ...

  9. android 7.0 新特性 和对开发者的影响

    android 7.0新特性 - jiabailong的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/jiabailong/article/details/5241 ...

随机推荐

  1. sed你所不知道的语法

    测试内容

  2. MVC框架介绍

    第一,建立一个解决方案然后在该解决方案下面新建mvc空项目. 第二,下面先对该项目的一些文件进行介绍: MVC项目文件夹说明: 1.(App_Data):用来保存数据文件,比如XML文件等 2.(Ap ...

  3. Space-vim的.spacevim配置备份

    安装 windows安装 配置 在C盘的用户目录下,有一个'.spacevim'的文件,可以修改你要的配置 " Let Vim and NeoVim shares the same plug ...

  4. Jboss:The LogManager was not properly installed (you must set the "java.util.logging.manager" system prop

    可能是jboss的服务器版本选择不对 ,比如我本地的Jboss服务器版本是  jboss-as-web-7.0.2.Final,选择的服务器版本是JBOOS  V7.1  Runtime ,就会报上面 ...

  5. dsm winscp 获得 root 权限修改上传文件

    使用DSM开了ssh只可以用admin登陆scp没有权限上传文件.可以用以下方法. ssh 登陆 dsm sudo -i  取得root权限 修改 /etc/sudoers 文件中 %administ ...

  6. python中os.system()的返回值

    [python中os.system()的返回值] 如果第三方程序返回的是布尔型返回值,os.system会将true转为1,false转为0进行返回. 问题: /bin/xxx.py是一个返回码为1的 ...

  7. ios开发者账号、证书相关内容

    背景:因为在实际测试中会涉及到不同的证书,而自己又对证书不了解,所以去查资料了解了一下不同证书的区别,如果有不对的地方,欢迎指正补充.   In House:所有手机都可以安装,但是不能上传到app ...

  8. freemaker在表格中遍历数据

    Controller层如下所示: @RequestMapping(value = "/test", method = RequestMethod.GET) public Strin ...

  9. Golang开发环境搭建-Vim篇

    一.一个干净的环境 找个干净的基础环境,方便确认每个搭建步骤后的效果: Ubuntu 14.04 x86_64 vim version 7.4.52 go version go1.4beta1 lin ...

  10. AnimationState

    1.1 AnimationClip AnimationClip是Unity3D中播放动画的最基本对象,通过FBX导入的各个动画对象其实就是一个AnimationClip.这个类已关键帧的形式记录了骨骼 ...