我想知道一种方法,以确保要显示的对话框颜色是我要复制的颜色,即如果显示的对话框没有以任何方式建立其颜色,则默认情况下将显示该颜色:
从理论上讲,最可靠的实现方式到最不肯定的实现方式,我已经取得了以下进展:
1)尝试获取对话框的颜色,因此我将其转换为相应的HTML颜色,并为HTML页面设置了该颜色。
使用这种方法,我发现了以下限制:
当我尝试使用类似这样的背景色时:
int color= ((ColorDrawable) dialog1.getButton(AlertDialog.BUTTON_POSITIVE).getBackground()).getColor();
除非我先设置背景颜色,否则我将得到无法转换为ColorDrawable(该类为RippleDrawable)的错误,这对我的情况没有帮助。
我尝试使用如下代码从RippleDrawable获取背景颜色:
RippleDrawable rippleDrawable = (RippleDrawable) button.getBackground();
Drawable.ConstantState state = rippleDrawable.getConstantState();
try {
Field colorField = state.getClass().getDeclaredField("mColor");
colorField.setAccessible(true);
ColorStateList colorStateList = (ColorStateList) colorField.get(state);
int rippleColor = colorStateList.getDefaultColor();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
但是,尽管我和其他人有亲戚关系,但我找不到任何颜色。
2)尝试获取Android用于显示AlertDialog的颜色。
我已经检查了Android源代码,并且在其类AlertDialog.java中看起来像是用此东西定义的。
if (themeResId == THEME_TRADITIONAL) {
return R.style.Theme_Dialog_Alert;
} else if (themeResId == THEME_HOLO_DARK) {
return R.style.Theme_Holo_Dialog_Alert;
} else if (themeResId == THEME_HOLO_LIGHT) {
return R.style.Theme_Holo_Light_Dialog_Alert;
} else if (themeResId == THEME_DEVICE_DEFAULT_DARK) {
return R.style.Theme_DeviceDefault_Dialog_Alert;
} else if (themeResId == THEME_DEVICE_DEFAULT_LIGHT) {
return R.style.Theme_DeviceDefault_Light_Dialog_Alert;
但是我什至看不到包含Theme_Dialog_Alert的文件,所以我被困在这里。
3)在仿真器中检查AlertDialog根据其API显示的颜色,并在运行时检查API并将颜色设置为所需的颜色。
这很好用,但是问题是我不确定颜色是否仅取决于API,或者应用程序中还有其他外部因素可能会改变它。我找不到能证实或否认这一点的参考。
我愿意就这三种方法提出建议,但我认为最简单的方法是知道我所说的关于依赖于API的颜色的说法是否正确。
感谢您的关注。