我需要更改应用程序中每个对话框的样式。 我的理解是,在阅读了样式和主题文档(确实相当差)之后,我想出了这个片段:
styles.xml
<resources>
<style name="RMTheme" parent="@android:style/Theme">
<item name="android:dialogLayout">@style/CustomDialog</item>
</style>
<style name="CustomDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@color/transparent_color</item>
<item name="android:textColorPrimary">@android:color/black</item>
</style>
</resources>
如果应用得当,应该创建具有透明背景和黑色文本的每个对话框。
这是我应用主题的地方。
AndroidManifest.xml
<application
android:theme="@style/RMTheme"
android:debuggable="true"
android:label="@string/app_name"
android:icon="@drawable/icon">
我猜问题出在我尝试将自己的命名空间的
Theme.Dialog
应用到 android 命名空间的 Theme.Dialog
的方式上。 基本上,我认为从代码中可以清楚地看出,我只想在 android 的默认对话框样式中添加/覆盖一些属性。
编辑:另请注意,我不想(事实上不能,因为我正在为 API 级别 9 进行编译)使用
Dialog(Context context, int style)
构造函数。 我想全局应用主题,而不需要显式地将主题 id 传递给每个对话框构造函数,而且,无论如何,我在这个 API 级别上都无法使用该主题。
编辑:糟糕...显然
Dialog(Context context, int style)
在此 API 级别可用。 这是我所想的AlertDialog(Context context, int style)
。 尽管如此,我仍然想在所有对话框中全局应用这个主题,而不是必须使用该构造函数。
android:dialogLayout
,
themes.xml
并不存在于 API 8中。您可以在“Android SDK文件夹”/platforms/android-8/data/res/values下找到所有相关的xml文件
这是
style/Theme
中与 Dialog
相关的 API 级别的唯一属性。
<!-- Dialog attributes -->
<item name="alertDialogStyle">@android:style/AlertDialog</item>
然后引用这个:
<style name="AlertDialog">
<item name="fullDark">@android:drawable/popup_full_dark</item>
<item name="topDark">@android:drawable/popup_top_dark</item>
<item name="centerDark">@android:drawable/popup_center_dark</item>
<item name="bottomDark">@android:drawable/popup_bottom_dark</item>
<item name="fullBright">@android:drawable/popup_full_bright</item>
<item name="topBright">@android:drawable/popup_top_bright</item>
<item name="centerBright">@android:drawable/popup_center_bright</item>
<item name="bottomBright">@android:drawable/popup_bottom_bright</item>
<item name="bottomMedium">@android:drawable/popup_bottom_medium</item>
<item name="centerMedium">@android:drawable/popup_center_medium</item>
</style>
这些是不同的 9 个补丁可绘制对象,操作系统根据您的主题选择它,Froyo 提供了一些,例如
Theme.Black
和 Theme.Light
。
对于 API 级别 8,就是这样!您似乎唯一能够通过 XML 更改的是那些与对话框背景相关的图像。较新的操作系统版本允许您覆盖
alertDialogTheme
属性,这使您可以通过 XML 进行更多控制。
我做了一个超简单的
AlertDialog
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("TESTING 123");
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
AlertDialog dialog = builder.create();
dialog.show();
这就是它在 Gingerbread 设备上的样子(懒得创建 Froyo 模拟器...)
现在我们通过 XML 覆盖警报对话框样式。
<style name="AppBaseTheme" parent="android:style/Theme">
</style>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:alertDialogStyle">@style/NewAlertDialog</item>
</style>
<style name="NewAlertDialog">
<item name="android:fullDark">@android:color/transparent</item>
<item name="android:topDark">@android:color/transparent</item>
<item name="android:centerDark">@android:color/transparent</item>
<item name="android:bottomDark">@android:color/transparent</item>
<item name="android:fullBright">@android:color/transparent</item>
<item name="android:topBright">@android:color/transparent</item>
<item name="android:centerBright">@android:color/transparent</item>
<item name="android:bottomBright">@android:color/transparent</item>
<item name="android:bottomMedium">@android:color/transparent</item>
<item name="android:centerMedium">@android:color/transparent</item>
</style>
我们将主题添加到清单文件中的
application
标签中。
现在对话框如下所示: android:theme="@style/AppTheme"
只需将其放入您的主题中即可:
<item name="android:dialogTheme">@style/MyDialogTheme</item>
并在 style.xml 中定义 MyDialogTheme 如下:
<style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorSecondary">@color/colorSecondary</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorPrimary">@color/text_color</item>
<item name="android:textColor">@color/text_color</item>
<item name="android:windowBackground">@color/background</item>
</style>
还要确保您的基本主题的父主题设置为 Theme.AppCompat。
另一个技巧是这样的:
而不是
new Dialog(getApplicationContext(), ...)
做
new Dialog(MyActivity.this, ...)