博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我的Android进阶之旅------>Android中Dialog系统样式讲解
阅读量:7237 次
发布时间:2019-06-29

本文共 8150 字,大约阅读时间需要 27 分钟。

      今天在维护公司的一个APP的时候,有如下场景。

弹出一个AlertDialog的时候,在系统语言是中文的时候,如下所示:

弹出一个AlertDialog的时候,在系统语言是English的时候,如下所示:

 

可以发现在系统语言为英语的时候,对话框中的白色文字已经完全看不清楚,对话框的背景颜色也变成了白色。因此需要修改对话框的主题。

 

修改之前代码如下:

AlertDialog commedialog = new AlertDialog.Builder(					WalkieTalkieActivity.this)					.setTitle(title)					.setView(vi_nolong)					.setPositiveButton(							WalkieTalkieActivity.this.getResources().getString(R.string.ok),							new DialogInterface.OnClickListener() {								public void onClick(DialogInterface dialog, int arg1) {																		int j = mSelectedGroupNum + 1;									int power_last = mIntercomSharePrefs.getInt("CurrentPower_"+j,0);									Log.i("wxj", "btn_power CurrentPower_"+j+" :" + power_last);									if (power_last == 1) {										mEditor.putInt("CurrentPower_"+j,0).commit();										mIntercom.setPowerLevel(0);										btn_power.setBackgroundResource(R.drawable.power_high);																			} else if (power_last == 0) {										mEditor.putInt("CurrentPower_"+j,1).commit();										mIntercom.setPowerLevel(1);										btn_power.setBackgroundResource(R.drawable.power_low);									}									dialog.dismiss();									((ViewGroup) vi_nolong.getParent()).removeView(vi_nolong);  								}							})					.setNegativeButton(							WalkieTalkieActivity.this.getResources().getString(R.string.cancel),							new DialogInterface.OnClickListener() {								public void onClick(DialogInterface dialog,										int whichButton) {																		dialog.dismiss();									((ViewGroup) vi_nolong.getParent()).removeView(vi_nolong);  								}							}).create();			commedialog.setCanceledOnTouchOutside(false);			commedialog.show();

 

可以发现,new AlertDialog.Builder的时候没有指定主题,

AlertDialog commedialog = new AlertDialog.Builder(WalkieTalkieActivity.this)

我们可以在new AlertDialog.Builder的时候指定一个主题,如下所示:

 

AlertDialog commedialog = new AlertDialog.Builder(					WalkieTalkieActivity.this,AlertDialog.THEME_HOLO_DARK)

 

完整代码如下:

AlertDialog commedialog = new AlertDialog.Builder(					WalkieTalkieActivity.this,AlertDialog.THEME_HOLO_DARK)					.setTitle(title)					.setView(vi_nolong)					.setPositiveButton(							WalkieTalkieActivity.this.getResources().getString(R.string.ok),							new DialogInterface.OnClickListener() {								public void onClick(DialogInterface dialog, int arg1) {																		int j = mSelectedGroupNum + 1;									int power_last = mIntercomSharePrefs.getInt("CurrentPower_"+j,0);									Log.i("wxj", "btn_power CurrentPower_"+j+" :" + power_last);									if (power_last == 1) {										mEditor.putInt("CurrentPower_"+j,0).commit();										mIntercom.setPowerLevel(0);										btn_power.setBackgroundResource(R.drawable.power_high);																			} else if (power_last == 0) {										mEditor.putInt("CurrentPower_"+j,1).commit();										mIntercom.setPowerLevel(1);										btn_power.setBackgroundResource(R.drawable.power_low);									}									dialog.dismiss();									((ViewGroup) vi_nolong.getParent()).removeView(vi_nolong);  								}							})					.setNegativeButton(							WalkieTalkieActivity.this.getResources().getString(R.string.cancel),							new DialogInterface.OnClickListener() {								public void onClick(DialogInterface dialog,										int whichButton) {																		dialog.dismiss();									((ViewGroup) vi_nolong.getParent()).removeView(vi_nolong);  								}							}).create();			commedialog.setCanceledOnTouchOutside(false);			commedialog.show();

 

这样的话就指定了一个黑色背景的主题,这样在系统语言为英语的时候,背景也是黑色的,如下所示:

在系统语言为中文的时候,背景也是黑色的,如下所示:

 

====================================================================================================================================

下面从源码角度来看看到底是怎么回事,查看AlertDialog.Build代码如下:

/**         * Constructor using a context for this builder and the {@link AlertDialog} it creates.         */        public Builder(Context context) {            this(context, resolveDialogTheme(context, 0));        }        /**         * Constructor using a context and theme for this builder and         * the {@link AlertDialog} it creates.  The actual theme         * that an AlertDialog uses is a private implementation, however you can         * here supply either the name of an attribute in the theme from which         * to get the dialog's style (such as {@link android.R.attr#alertDialogTheme}         * or one of the constants         * {@link AlertDialog#THEME_TRADITIONAL AlertDialog.THEME_TRADITIONAL},         * {@link AlertDialog#THEME_HOLO_DARK AlertDialog.THEME_HOLO_DARK}, or         * {@link AlertDialog#THEME_HOLO_LIGHT AlertDialog.THEME_HOLO_LIGHT}.         */        public Builder(Context context, int theme) {            P = new AlertController.AlertParams(new ContextThemeWrapper(                    context, resolveDialogTheme(context, theme)));            mTheme = theme;        }

resolveDialogTheme(Context context, int resid) 代码如下:

 

static int resolveDialogTheme(Context context, int resid) {        if (resid == THEME_TRADITIONAL) {            return com.android.internal.R.style.Theme_Dialog_Alert;        } else if (resid == THEME_HOLO_DARK) {            return com.android.internal.R.style.Theme_Holo_Dialog_Alert;        } else if (resid == THEME_HOLO_LIGHT) {            return com.android.internal.R.style.Theme_Holo_Light_Dialog_Alert;        } else if (resid == THEME_DEVICE_DEFAULT_DARK) {            return com.android.internal.R.style.Theme_DeviceDefault_Dialog_Alert;        } else if (resid == THEME_DEVICE_DEFAULT_LIGHT) {            return com.android.internal.R.style.Theme_DeviceDefault_Light_Dialog_Alert;        } else if (resid >= 0x01000000) {   // start of real resource IDs.            return resid;        } else {            TypedValue outValue = new TypedValue();            context.getTheme().resolveAttribute(com.android.internal.R.attr.alertDialogTheme,                    outValue, true);            return outValue.resourceId;        }    }

几个主题的值为:

/**     * Special theme constant for {@link #AlertDialog(Context, int)}: use     * the traditional (pre-Holo) alert dialog theme.     */    public static final int THEME_TRADITIONAL = 1;        /**     * Special theme constant for {@link #AlertDialog(Context, int)}: use     * the holographic alert theme with a dark background.     */    public static final int THEME_HOLO_DARK = 2;        /**     * Special theme constant for {@link #AlertDialog(Context, int)}: use     * the holographic alert theme with a light background.     */    public static final int THEME_HOLO_LIGHT = 3;    /**     * Special theme constant for {@link #AlertDialog(Context, int)}: use     * the device's default alert theme with a dark background.     */    public static final int THEME_DEVICE_DEFAULT_DARK = 4;    /**     * Special theme constant for {@link #AlertDialog(Context, int)}: use     * the device's default alert theme with a dark background.     */    public static final int THEME_DEVICE_DEFAULT_LIGHT = 5;

由此可见,当我们不指定主题的时候,

AlertDialog commedialog = new AlertDialog.Builder(WalkieTalkieActivity.this)

系统给我们的主题是:

TypedValue outValue = new TypedValue();            context.getTheme().resolveAttribute(com.android.internal.R.attr.alertDialogTheme,                    outValue, true);            return outValue.resourceId;

 

====================================================================================================================================

下面分别来测试一下这几个主题

主题为:AlertDialog.THEME_HOLO_LIGHT

AlertDialog commedialog = new AlertDialog.Builder(					WalkieTalkieActivity.this,AlertDialog.THEME_HOLO_LIGHT)

 

主题为:AlertDialog.THEME_TRADITIONAL

AlertDialog commedialog = new AlertDialog.Builder(					WalkieTalkieActivity.this,AlertDialog.THEME_TRADITIONAL)

 

主题为:AlertDialog.THEME_DEVICE_DEFAULT_DARK

AlertDialog commedialog = new AlertDialog.Builder(					WalkieTalkieActivity.this,AlertDialog.THEME_DEVICE_DEFAULT_DARK)

 

主题为:AlertDialog.THEME_DEVICE_DEFAULT_LIGHT

AlertDialog commedialog = new AlertDialog.Builder(					WalkieTalkieActivity.this,AlertDialog.THEME_DEVICE_DEFAULT_LIGHT)

 

====================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址

====================================================================================

 

你可能感兴趣的文章
freeradius+mysql+pppoe认证
查看>>
与“十“俱进 阿里数据库运维10年演进之路
查看>>
关于运维人员的未来职业生涯
查看>>
git 学习笔记
查看>>
shell中$0,$,$!等的特殊用法
查看>>
FastDFS_V5.05分布式存储安装与使用
查看>>
2014年下半年信息系统项目管理师上午试题试题与答案 37
查看>>
简单可达性分析
查看>>
忘记管理地址巧用Sniffer来解决
查看>>
getter与setter的意义
查看>>
在Linux下快速获取某个线程的IO读写情况
查看>>
32位16进制浮点数转化成10进制数
查看>>
搭建lnmp+tomcat+jdk环境 与安装zrblog
查看>>
redis 主从同步失败
查看>>
Linux Crontab 定时任务命令详解
查看>>
关于git,100MB大文件上传限制的问题,这里MARK一下
查看>>
分析SELinux日志,排除SELinux疑难
查看>>
PostgreSQL的递归查询(with recursive)
查看>>
iOS 改变字体行间距与字间距
查看>>
美丽说2012校招笔试面试全过程
查看>>