今天在维护公司的一个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)

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

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

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

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

我的Android进阶之旅------>Android中Dialog系统样式讲解的更多相关文章

  1. 我的Android进阶之旅------>Android中查看应用签名信息

    一.查看自己的证书签名信息 如上一篇文章<我的Android进阶之旅------>Android中制作和查看自定义的Debug版本Android签名证书>地址:http://blog ...

  2. 我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色

    通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...

  3. 我的Android进阶之旅------> Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...

  4. 我的Android进阶之旅------>Android中AsyncTask源码分析

    在我的<我的Android进阶之旅------>android异步加载图片显示,并且对图片进行缓存实例>文章中,先后使用了Handler和AsyncTask两种方式实现异步任务机制. ...

  5. 我的Android进阶之旅------> Android为TextView组件中显示的文本加入背景色

    通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...

  6. 我的Android进阶之旅------>Android利用温度传感器实现带动画效果的电子温度计

    要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...

  7. 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现

    我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...

  8. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之实现游戏逻辑(五)

    在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的 ...

  9. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)

    正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piec ...

随机推荐

  1. CEF与JavaScript交互读取电脑信息

    CefSharp中c#和JavaScript交互读取电脑信息 介绍 CEF是由Marshall Greenblatt于2008年创建的基于Google Chromium的BSD许可开源项目.与主要关注 ...

  2. rsync权限操作

    rsync对目的端权限如果不使用 -a 或者-p   -a=-rlptgoD 目的端的目录和文件权限不会改变 同步过程中改变目录和文件权限用法: rsync -rltDvP --chmod=Dugo= ...

  3. View的setTag和getTag使用

    在listview 优化其中,会使用到setTag()以及getTag()方法 代码例如以下: @Override public View getView(int position, View con ...

  4. 10710 - Chinese Shuffle(数论+完美洗牌)

    UVA 10710 - Chinese Shuffle 题目链接 题意:给定n张牌,完美洗牌n - 1次,问是否会变回原来的序列 思路:完美洗牌: 如果有a1a2a3...anb1b2b3...bn的 ...

  5. Atitit..net clr il指令集 以及指令分类  与指令详细说明

    Atitit..net clr il指令集 以及指令分类  与指令详细说明 1.1. .NET CLR 和 Java VM 都是堆叠式虚拟机器(Stack-Based VM), 1 1.2. 查看工具 ...

  6. Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net

    Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net 1. -catalog与schema的设计区别1 ...

  7. 使用 ObjectDataSource 缓存数据

    简介 就计算机科学而言 , 缓存 过程包括成本昂贵的数据或信息的获取 , 以及将备份存储在可快速访问的位置.对于数据驱动的应用程序,大型.复杂的查询通常会消耗大量应用程序执行时间.要提升这类应用程序的 ...

  8. c++ [wrong]simple "Garbage Collector"

    In fact, Ptr alone can accomplish the task mentioned below. Implementation see Ptr.h, main2.cpp. In ...

  9. 在python中配置tornado服务

    import tornado.httpserver import tornado.options import tornado.web from tornado.options import defi ...

  10. 图谱论(Spectral Graph Theory)基础

    拉普拉斯矩阵(Laplacian matrix),也称为导纳矩阵(Admittance matrix)或者基尔霍夫矩阵(Kirchohoff matrix) 归一化的拉普拉斯矩阵定义为 例子: 拉普拉 ...