将主题应用于Android应用程序中的所有Dialog

时间:2014-01-09 13:44:49

标签: android android-layout android-dialog android-theme android-styles

我需要更改应用程序中每个对话框的样式。我的理解是,在阅读了样式和主题文档(实际上相当差)之后,我想出了这个片段:

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级别使用它。

编辑:Woops ...显然Dialog(Context context, int style)在此API级别可用。我想到的是AlertDialog(Context context, int style)。尽管如此,我仍然希望将这个主题全局应用于所有对话框,而不是必须使用该构造函数。

2 个答案:

答案 0 :(得分:2)

API级别8的解决方案,EDIT

如果您查看Android SDK附带的android:dialogLayout,则 API 8

themes.xml不存在。您可以在“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.BlackTheme.Light

对于API级别8,就是这样!您似乎唯一能够通过XML更改的是与对话框背景相关的图像。较新的操作系统版本允许您覆盖alertDialogTheme属性,从而通过XML为您提供更多控制。

API 8后台更改

我做了一个非常简单的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模拟器......)

Before change

现在我们通过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标记。

现在Dialog看起来像这样:     机器人:主题= “@风格/ AppTheme”

enter image description here

答案 1 :(得分:0)

另一个诀窍是:

而不是

new Dialog(getApplicationContext(), ...)

待办事项

new Dialog(MyActivity.this, ...)