将主题应用于 Android 应用程序中的所有对话框

问题描述 投票:0回答:3

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

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 android-layout android-dialog android-theme android-styles
3个回答
1
投票

API 级别 8 的解决方案,编辑

如果您查看 Android SDK 中包含的

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 进行更多控制。

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
标签中。

现在对话框如下所示: android:theme="@style/AppTheme"

enter image description here


0
投票

只需将其放入您的主题中即可:

<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。


-1
投票

另一个技巧是这样的:

而不是

new Dialog(getApplicationContext(), ...)

new Dialog(MyActivity.this, ...)
© www.soinside.com 2019 - 2024. All rights reserved.