【问题标题】:Custom activity theme with default dialog theme具有默认对话框主题的自定义活动主题
【发布时间】:2018-05-16 09:19:17
【问题描述】:

我正在尝试使用默认 AppCompat 主题显示 AlertDialog,同时主要活动具有自定义主题。我的问题是显示的 AlertDialog 似乎继承了一些父活动样式(尤其是强调色,还有编辑文本颜色)。

这是我的活动主题:

<style name="Theme.MainMenu.MyTheme" parent="Theme.AppCompat">
    <item name="android:windowBackground">@drawable/background</item>
    <item name="colorPrimary">@color/myPrimary</item>
    <item name="colorPrimaryDark">@color/myPrimary_dark</item>
    <item name="colorAccent">@color/myAccent</item>
</style>

这是我创建 AlertDialog(包含 EditText)的方式

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.Theme_AppCompat_Light_Dialog_Alert);

如果我没有为我的活动指定任何主题,AlertDialog 将按预期显示:

但如果我将 MyTheme 应用于我的活动,AlertDialog 看起来像:

尽管我为 Builder 提供了 Theme_AppCompat_Light_Dialog_Alert 主题。强调色(此处为红色)和 EditText 颜色似乎继承自活动主题。

为什么会有这种继承,以及如何避免它,或者,是否有任何解决方案可以强制 AlertDialog 使用“完整”默认主题?

非常感谢

编辑 1:

根据 MinnuKaAnae 的建议,我可以基于 Theme.AppCompat.Light.Dialog.Alert 为 DialogAlert 创建自定义样式,覆盖所需的属性,但我需要指向 AppCompat 默认颜色:

<style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorAccent">@color/NEED_APPCOMPAT_DEFAULT_COLOR_ACCENT_HERE</item>
    <item name="android:textColorPrimary">@color/NEED_APPCOMPAT_DEFAULT_PRIMARY_COLOR_HERE</item>
    <item name="android:background">@color/NEED_APPCOMPAT_DEFAULT_BACKGROUND_COLOR_HERE</item>
</style>

在我的情况下,我还需要将 EditText 文本颜色覆盖为 Light 版本(黑色文本),因为 Activity 不是基于 Light 主题:属性 android:editTextColor doen' t 似乎完成了这项工作。

【问题讨论】:

  • 发布您的 Theme_AppCompat_Light_Dialog_Alert
  • 创建一个自定义主题并放入您的 colorPrimary、colorDarkPrimary 和 coloraccent 颜色并在此对话框中使用它
  • @MinnuKaAnae : Theme_AppCompat_Light_Dialog_Alert 样式是 Android 支持库之一。
  • @ND1010_ :好的,我可以为 AlertDialog 创建一个自定义主题,但我需要使用默认的 (Theme.AppCompat.Light) colorPrimary/colorDarkPrimary 和 colorAccent。我认为可能存在更好的解决方案。
  • @Virtual 这个 Theme_AppCompat_Light_Dialog_Alert 将在您的 styles.xml 中可用。您必须覆盖 colorAccent 才能满足您的需求,请尝试以下答案。将其添加到您的 styles.xml 中。那会奏效的。

标签: android dialog styles themes


【解决方案1】:

添加这个

<style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorAccent">#006A4E</item>
    <item name="android:textColorPrimary">#3f3f3f</item>
    <item name="android:background">#ffffff</item>
</style>

改变

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle);

【讨论】:

  • 如果添加这个,我会得到一个“资源类型为'style'且符号名称为'Theme_AppCompat_Light_Dialog_Alert'的表中的重复符号”。正如预期的那样:Compat 库定义了这个样式名称。
  • @Virtual 样式名称 AppCompatAlertDialogStyle 可以是任何东西,检查我更新的答案,父名称 Theme.AppCompat.Light.Dialog.Alert,这是 android 中的默认主题,我们必须覆盖它。
  • 或者根据您的需要更改 Theme_AppCompat_Light_Dialog_Alert 中的强调色。
  • 好的,如果我使用你的建议,我需要知道 默认的 AppTheme colorAccent 并且能够设置 EditText 文本颜色,该属性 android: editTextColor 似乎没有完成这项工作。请参阅我的帖子编辑。
  • 我想避免的解决方案 :) 但是感谢您的建议!
【解决方案2】:

如果您希望 AlertDialog 的主题与您的 Activity 使用的主题不同,请尝试使用上下文主题包装器:

ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.CustomStyle);
AlertDialog.Builder builder = new AlertDialog.Builder(wrapper);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多