资讯专栏INFORMATION COLUMN

Android之Activity设置主题背景后AlertDialog的背景随之改变的问题

luxixing / 1192人阅读

摘要:解决的方法很简单,就是在的主题中将背景设置成给闪屏页一样的图片然后在清单文件中将的设置成即可。的显示很简单,只需调用一句代码运行之后,发现的样式变得十分诡异如果没有左上角的文字,我几乎就看不出它是个对话框了。

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

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

    

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

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

public class UpdateDialog extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("检测到新版本啦!");
        builder.setMessage("1、优化了UI细节;
2、修复了一大波的bug");
        //立即更新按钮
        builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //这里执行更新操作
                Toast.makeText(getActivity(), "执行更新操作", Toast.LENGTH_SHORT).show();
                dialog.dismiss();
            }
        });
        //稍后再说按钮
        builder.setNegativeButton("稍后再说", new DialogInterface.OnClickListener() {
            @Override
            public 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中的@drawable/splash_bg,再次运行就会发现,对话框的背景变成了白色,这正是我们想要的样式:

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

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

    

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

Light表示它是浅色主题,也就是对话框的Title和Message文字颜色会是黑色的;

NoActionBar则去除了顶部的标题栏;

MinWidth保证了它具有最小宽度,不会缩成一团。

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14323.html

相关文章

  • 界面工具 - 收藏集 - 掘金

    摘要:上列表左右滑动开源组件掘金是一款用于为上的排布提供左滑右滑操作的库。这里我贴出最终的兼容方案教你用两层嵌套实现三级展示界面掘金最近项目中使用一个三级展示列表,要求第一级和第二季都可以折叠,并有不同的图标变换,第三层展示数据,可点击。 八年 Android 开发,看我如何简化 Android 的 UI 开发! - Android - 掘金作者 : Super Mary 校对者: Zhao...

    wuaiqiu 评论0 收藏0
  • Android工具箱迁移到AppCompat

    摘要:同时你应该注意到,当你的为的时候,你需要使用对应的版本。这一概念,我在的项目快速导入已经有所介绍。你需要将之前的主题替换为等主题。 这是一个系列,我们将其命名为工具箱,如果你还没有看之前的文章: Android工具箱之Context解析 Android工具箱之文件目录 Android工具箱之组织你的代码文件 Android工具箱之理解app资源文件 Android工具箱之Activit...

    bluesky 评论0 收藏0
  • android:launchMode小分析

    摘要:如果某个的实例并不处于栈顶的话,系统将会创建新的实例,和一样。最后再看看,只有被重新压入了栈顶,仍在栈的底部,这样也满足要求。 前言 新年伊始,本打算大展宏图的本人却一直处于项目经理的忽视之中,终于的终于,本人迎来了新年的第一个重磅需求。作为一个拥有上亿用户的APP,本APP的用户条款竟然未受到任何投诉和质疑,已经被告上法庭的某APP决定也使用我们的用户条款。 设计 Android松耦...

    TZLLOG 评论0 收藏0
  • 轻松搞定表白女朋友:Android版APP (零基础也可直接下载软件)

    摘要:安卓端可以给人一种定制和精美的感觉,这是网页所做不到的,网页链接不见了就没了。因此在这里将自己写的软件制作流程以及代码全部开源,这里采用了与安卓原生混合开发的技术,引入了腾讯内核替换,可以让软件加载速度提高百分之三十。 在我们平时生活当中,经常会看到一些表白女朋友的html网页,但是Android端的表白软件可以说是基本没有,笔者在全网搜了一下,就没有一个可以用的。安卓端可以给人一种定制和...

    番茄西红柿 评论0 收藏0
  • 2019 Android 高级面试题总结

    摘要:子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠。因此的循环并不会对性能有过多的消耗。 说下你所知道的设计模式与使用场景 a.建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 使用场景比如最常见的AlertDialog,拿我们开发过程中举例,比如Camera...

    YorkChen 评论0 收藏0

发表评论

0条评论

luxixing

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<