android activity theme dialog,Android之Activity设置主题背景后AlertDialog的背景随之改变的问题...

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

bVbd6Yz

关于如何解决启动时的白屏问题,大家可以参考这篇博客:

Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法。解决的方法很简单,就是在SplashActivity的主题中将背景设置成给闪屏页一样的图片:

true

true

@drawable/splash_bg

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

bVbd6YD

在实际项目中,应用往往会在刚启动时检测是否有新的版本,如果有的话就会弹出一个提示对话框询问用户是否需要更新,或者直接强制用户更新。对话框我们选用系统原生的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细节;\n2、修复了一大波的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的样式变得十分诡异:

bVbd7bm

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

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

bVbd7bw

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

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

@android:color/white

这里我们就单独将对话框的背景设为白色,要注意的是一定要选择好继续的样式,也就是@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);

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值