自定义活动主题,默认对话框主题

时间:2017-12-02 11:30:28

标签: android dialog styles themes

我正在尝试使用默认的AppCompat主题显示AlertDialog,同时主要活动是具有自定义主题。我的问题是显示的AlertDialog似乎继承了一些父活动样式(特别是重音颜色,还有edittext颜色)。

这是我的活动主题:

<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按预期显示: As expected

但如果我将MyTheme应用于我的活动,则AlertDialog看起来像: Inherited colorAccent and EditText color

尽管我给了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'似乎做了这件事。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

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