在制作App的闪屏页时如果你仔细观察就会发现,每次你在手机桌面点击图标启动应用时会先出现一个白色背景(也就是我们通常所说的白屏),然后才会跳转到闪屏页。

就像这样:

关于如何解决启动时的白屏问题,大家可以参考这篇博客:
Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法。解决的方法很简单,就是在SplashActivity的主题中将背景设置成给闪屏页一样的图片:

<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar"><item name="android:windowNoTitle">true</item><item name="android:windowFullscreen">true</item><item name="android:background">@drawable/splash_bg</item></style>

然后在清单文件中将SplashActivity的theme设置成android:theme="@style/SplashTheme"即可。下面就是去除白屏后的效果:

在实际项目中,应用往往会在刚启动时检测是否有新的版本,如果有的话就会弹出一个提示对话框询问用户是否需要更新,或者直接强制用户更新。对话框我们选用系统原生的AlertDialog就好(为了兼容低版本最好选择v7包下),但我个人更喜欢将其封装到DialogFragment中,代码如下:

public class UpdateDialog extends DialogFragment {@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());builder.setTitle("检测到新版本啦!");builder.setMessage("1、优化了UI细节;n2、修复了一大波的bug");//立即更新按钮builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//这里执行更新操作Toast.makeText(getActivity(), "执行更新操作", Toast.LENGTH_SHORT).show();dialog.dismiss();}});//稍后再说按钮builder.setNegativeButton("稍后再说", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//跳转到首页SplashActivity activity = (SplashActivity) getActivity();activity.toMainPage();dialog.dismiss();}});AlertDialog dialog = builder.create();dialog.show();//修改按钮颜色,必须在show方法之后调用dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLUE);dialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(Color.RED);return dialog;}
}

当然,版本更新的逻辑不可能这么简单的,我们这里只是简单地先显示一个对话框。DialogFragment的显示很简单,只需调用一句代码:

new UpdateDialog().show(getFragmentManager(),"VersionUpdate");

运行之后,发现AlertDialog的样式变得十分诡异:

如果没有左上角的文字,我几乎就看不出它是个对话框了。明明我们用的就是原生的AlertDialog,为什么会变成这副模样呢?

还记得我们前面为了解决启动时白屏在Activity的样式中将background设置成了闪屏页背景图片吗?现在对话框的背景也是这张图片,怎么这么巧?去掉SplashActivity的样式SplashTheme中的<item name="android:background">@drawable/splash_bg</item>,再次运行就会发现,对话框的背景变成了白色,这正是我们想要的样式:

现在看来,在Activity中修改主题样式的背景也会影响到其他控件的背景的,这里的AlertDialog的背景就被强制变成了闪屏页的图片。那么有什么办法既可以解决启动白屏,又能保留住Dialog自身对话框的吗?

经过我的实践,发现在代码中设置Dialog的背景没有效果,必须在样式中去设置,我们可以给AlertDialog设置一个style:

<style name="UpdateDialogStyle" parent="@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar.MinWidth"><!--该行代码就是设置AlertDialog的背景--><item name="android:background">@android:color/white</item></style>

这里我们就单独将对话框的背景设为白色,要注意的是一定要选择好继续的样式,也就是@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar.MinWidth。从它的名字就可以看出它有如下的作用:

  1. Light表示它是浅色主题,也就是对话框的Title和Message文字颜色会是黑色的;
  2. NoActionBar则去除了顶部的标题栏;
  3. MinWidth保证了它具有最小宽度,不会缩成一团。

回到UpdateDialog中,设置AlertDialog的样式就可以了:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.UpdateDialogStyle);

所有的代码都已经在文章中体现了,源码就不放了。希望能够对大家有所帮助,少踩一些坑。

看到这里,觉得写的还行的朋友可以留个赞哦!文章已被收录至专栏【进击的Android秃头】,多谢关注!

作者: @程序写到秃

专栏:“下方卡片”【进击的Android秃头

进击的Android秃头​zhuanlan.zhihu.com

文章每周持续更新,可以微信搜索「 程序猿养成中心 」第一时间阅读和催更(比博客早一到两篇哟),另外“点击公众号下方面试/更多资料”,直接免费获取①一二线互联网企业Android开发岗面试题汇总(答案解析)以及②Android架构知识点汇总pdf+③超清Android进阶思维脑图。

android alertdialog_Android进阶:Activity设置主题背景后AlertDialog的背景随之改变的问题分析相关推荐

  1. Win10主题更改后无法变更背景怎么解决

    在电脑使用中会有各种不同的主题,我们会不断的的选择自己喜欢的主题,那么遇到主题更改后无法变更背景怎么解决?为此系统屋为你提供Win10主题更改后无法变更背景解决方法,你可以通过操作来快速的解决自己的问 ...

  2. Android 解决通过自定义设置打开热点后手机搜索不到热点的问题。

    Android 解决通过自定义设置打开热点后手机搜索不到热点的问题. 参考文章: (1)Android 解决通过自定义设置打开热点后手机搜索不到热点的问题. (2)https://www.cnblog ...

  3. 为activity设置主题theme

    在实践中有这么一个需求,有一个BaseActivity,相同布局放置在这个Activity中,其他Activity继承自BaseActivity.为了使所有Activity都统一使用背景图片,一般做法 ...

  4. 【GPS】Android O平台如何设置SUPL地址,以及GPS三个配置文件的优先级分析

    Android O平台如何设置SUPL地址? SUPL地址: SUPL_HOST   SUPL_PORT 问题描述: Android O 以前的版本, SUPL地址是通过system/gps.conf ...

  5. android 进程被回收,Android开发进阶:Activity和进程的回收和状态恢复

    不管是安卓的官方文档还是源码注释,处处可见"从 Activity A 跳到 Activity B,当系统内存不足时 A 可能会被回收--",而且没有明确说明 A 和 B 是否属于同 ...

  6. android设置主题和自定义主题的方法

    android设置主题和自定义主题的方法 嘿嘿,书接上回,android有两种设置主题到方法,一种就是通过修改manifest文件,一种就是在通过修改我们的java代码:主题的自定义设置和样式的自定义 ...

  7. android style(样式)和theme(主题)设置

    android应用程序如何设置样式,包括样式定义.单个view设置样式. 全局样式设置.样式继承关系. 1.样式定义 android的样式定义在res/values/style.xml文件中,类似we ...

  8. 安卓java换主题_android设置主题和自定义主题的方法

    嘿嘿,书接上回,android有两种设置主题到方法,一种就是通过修改manifest文件,一种就是在通过修改我们的java代码:主题的自定义设置和样式的自定义设置类似. 首先我们先来自定两个主题文件. ...

  9. flutter theme:themeData() 统一设置主题颜色不起作用解决方法

    随着flutter组件的版本更新每一个组件的使用方法和作用都有了有些变化.今天我遇到的一个问题让我很头疼,网上找了很多没找到答案,试了好多方法最后找到了解决方法. 问题:flutter Materia ...

最新文章

  1. 《CCNP TSHOOT 300-135认证考试指南》——2.2节故障检测与排除及网络维护工具箱
  2. python多维字符数组_python多维数组内找指定字符串
  3. 赠书:《Java性能优化实践》,众多业内大佬推荐阅读
  4. 2020 年国外 9 个顶级的 Java 框架,你知道几个?
  5. 【视频】详解HDFS的HA高可用原理
  6. Go语言中使用panic和recover简化错误处理
  7. 切片 里面包含interface_Golang的数组和切片
  8. GetUserName()第二个参数中指明缓冲区长度
  9. Cognos 优化-大数据量的报表
  10. xampp的安装及使用
  11. R语言 生存分析与cox模型的学习笔记
  12. mediapipe系列之一脸部特征点标记
  13. 【Excel神技】之 快速填充
  14. 从语言之争到年龄焦虑
  15. 关闭 centos7 的滴滴声
  16. 【论文汇总】人群计数中Transformer的应用,持续更新
  17. Excel的规划求解实例
  18. 第四章 数学知识 质数相关
  19. 【C#视频】——哈希表
  20. 思科(Netacad)账号注册教学,完美解决登录时找不到该账号的问题,亲身实测可用。最新最详细

热门文章

  1. docker快速搭建数据库测试环境
  2. 假设linux分配给u盘设备名是,嵌入式linux开发基础试卷-应用物理A答案
  3. matlab蚁群算法代码,蚁群算法的matlab实现
  4. springboot实体映射到数据库_SpringBoot 操作 ElasticSearch 详解
  5. IDEA Maven项目添加本地jar包
  6. java使double保留两位小数
  7. mysql一次运行多个SQL文件
  8. linux unzip到指定目录
  9. 《Android Studio开发实战 从零基础到App上线(第2版)》出版后记
  10. Android开发笔记(七)初识Drawable