我的Android进阶之旅------>Android中Dialog系统样式讲解
今天在维护公司的一个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系统样式讲解的更多相关文章
- 我的Android进阶之旅------>Android中查看应用签名信息
一.查看自己的证书签名信息 如上一篇文章<我的Android进阶之旅------>Android中制作和查看自定义的Debug版本Android签名证书>地址:http://blog ...
- 我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色
通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...
- 我的Android进阶之旅------> Android在TextView中显示图片方法
面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...
- 我的Android进阶之旅------>Android中AsyncTask源码分析
在我的<我的Android进阶之旅------>android异步加载图片显示,并且对图片进行缓存实例>文章中,先后使用了Handler和AsyncTask两种方式实现异步任务机制. ...
- 我的Android进阶之旅------> Android为TextView组件中显示的文本加入背景色
通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...
- 我的Android进阶之旅------>Android利用温度传感器实现带动画效果的电子温度计
要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...
- 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现
我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之实现游戏逻辑(五)
在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的 ...
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)
正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piec ...
随机推荐
- HTML输入验证提示信息
1.oninvali事件通过setCustomValidity方法来自定义提示信息 <form action=""> <label> 数字: <inp ...
- 工作总结 razor 接收datatable
- pthread_create11121
#include <stdlib.h> #include <stdio.h> #include <pthread.h> void* test(void* args) ...
- kafka 部分问题处理记录
转载请注明原创地址:http://www.cnblogs.com/dongxiao-yang/p/7600561.html 一 broker启动后ReplicaFetcherThread OOM 版 ...
- 459. Repeated Substring Pattern【easy】
459. Repeated Substring Pattern[easy] Given a non-empty string check if it can be constructed by tak ...
- java gc日志详解
从 Full GC 信息可知,新生代可用的内存大小约为 18M,则新生代实际分配得到的内存空间约为 20M(为什么是 20M? 请继续看下面...).老年代分得的内存大小约为 42M,堆的可用内存的大 ...
- 椭圆曲线ECC基本概念
椭圆曲线的曲线方程是以下形式的三次方程: y2+axy+by=x3+cx2+dx+e a,b,c,d,e是满足某些简单条件的实数.定义中包含一个称为无穷点的元素,记为O 如果其上的3个点位于同一直线上 ...
- 第一百六十六节,jQuery,基础 DOM 和 CSS 操作,元素内容,元素属性,css和class,元素宽度高度、偏移、滚动条
jQuery,基础 DOM 和 CSS 操作,元素内容,元素属性,css和class,元素宽度高度.偏移.滚动条 学习要点: 1.DOM 简介 2.设置元素及内容 3.元素属性操作 4.元素样式操作 ...
- Distinct powers (Project Euler 29 加强版)
题目大意: $2<=a,b<=n$ 求 $a^b$能表示多少不同的正整数. 原题中n=100,可以直接暴力求解,常见的两种解法是写高精度或者取对数判断相等. 直觉告诉我应该有更加优秀的解法 ...
- 寒城攻略:Listo 教你用Swift 语言编写 IOS 平台流媒体播放器
先展示播放器效果: 依然继承 Listo 本人的强迫症,还是从最初到完毕完整的写一个攻略来记录一下,这里声明 Listo 本人也是看了非常多的戴维营攻略才总结分享给大家这一篇攻略的. 首先,Lis ...