【问题标题】:Dialog skinning with AppCompat-v7 22 results in ugly shadows on api < 21使用 AppCompat-v7 22 进行对话框蒙皮会在 api < 21 上产生难看的阴影
【发布时间】:2015-04-13 14:39:53
【问题描述】:

我正在使用 AppCompat 编写一个材料设计风格的应用程序。由于 AppCompat 不影响对话框,因此我将对话框设置为这样:

styles.xml:

<style name="AppTheme.Base" parent="Theme.AppCompat">
    <!-- Set AppCompat’s color theming attrs -->
    <item name="colorPrimary">@color/green</item>
    <item name="colorPrimaryDark">@color/green_darker</item>
    <item name="colorAccent">@color/accent</item>

    <item name="android:alertDialogTheme">@style/alertDialog</item>
    <item name="android:dialogTheme">@style/alertDialog</item>
</style>

<style name="alertDialog" parent="Theme.AppCompat.Dialog">
    <item name="colorPrimary">@color/green</item>
    <item name="colorPrimaryDark">@color/green_darker</item>
    <item name="colorAccent">@color/accent</item>
</style>

我在 android api >= 21 上得到的正是我想要的,但在其他设备上,我最终会在对话框周围出现一个“框”。

有没有办法摆脱对话框周围的“框”,甚至可以在 api

Api

API 上的应用 >= 21:

【问题讨论】:

  • 对于皮肤警报对话框,您需要使用android:Theme.DeviceDefault.Dialog.Alert(始终为原生外观)主题。否则背景将被复制。在 API 21 上你看不出有什么区别,但我怀疑会有透支。对于作为对话框的皮肤活动,请使用android:Theme.DeviceDefault.Dialog(原生外观)或Theme.AppCompat.Dialog(材质外观)主题。
  • android:Theme.DeviceDefault.Dialog 仅适用于 API > 14。我在 API 11 上使用什么?
  • 此外,这也会过度绘制非棒棒糖 api 的边框。 image
  • 老实说,没有人在乎 API 11,实际使用中几乎没有 API 11 的设备。你不妨让你的 minSdk=14。
  • 是的,我上面说的。您在这些对话框中使用的文本外观不能继承或成为TextAppearance.AppCompat.*。定义自定义文本外观样式并使用它们。继承@android:TextAppearance并根据Material Design规范(文本类型Body 1)自定义textColortextSize,你会没事的。

标签: android android-support-library material-design android-appcompat


【解决方案1】:

有了新的AppCompat v22.1,您可以使用新的android.support.v7.app.AlertDialog 或新的AppCompatDialog

只需使用这样的代码(当然,在您的情况下,您必须使用自定义布局才能拥有进度条)

import android.support.v7.app.AlertDialog

AlertDialog.Builder builder =
       new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle);
            builder.setTitle("Dialog");
            builder.setMessage("Lorem ipsum dolor ....");
            builder.setPositiveButton("OK", null);
            builder.setNegativeButton("Cancel", null);
            builder.show();

并使用这样的样式:

<style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
        <item name="colorAccent">#FFCC00</item>
        <item name="android:textColorPrimary">#FFFFFF</item>
        <item name="android:background">#5fa3d0</item>
    </style>

【讨论】:

  • 您知道我们如何只更改正按钮 TextColor 和 BackgroundColor 吗?
  • @Neige 在builder.show(); 之后使用builder.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(Color.parseColor("#FF0000"));.setBackgroundColor() 或...以相同的方式。
  • 对于 ProgressDialog ?
【解决方案2】:

如果有人仍在寻找简单有效的解决方案,只需将此行添加到您的“alertDialog”样式中:

<item name="android:windowBackground">@android:color/transparent</item>

附:更改此属性也会影响 PreferenceFragment 在 API >= 21 上的对话框,因此请确保您使用不同的样式:API = 21 没有任何更改

【讨论】:

  • 这是正确答案。创建一个扩展应用程序兼容主题之一的主题并覆盖上面提到的窗口背景。在 ProgressDialog 的构造中应用主题,不再有奇怪的背景。
【解决方案3】:

在为我的所有 AlertDialogs 使用 android.support.v7.app.AlertDialog 时,我在使用新的 AppCompat 22 库时遇到了完全相同的问题,但额外的背景层仅影响 ProgressDialogs。

当使用我的自定义主题设置样式时,我所有的 AlertDialogs 看起来都很棒,但是 ProgressDialog 在背景上有奇怪的覆盖,如 OP 中所述。

我有一个选择是在每次构建 ProgressBar 时设置特定样式,但我正在寻找一个应用程序范围的解决方案。

借助这两个链接:

How to Style AlertDialogs like a ProJoerg Richter Blog 我能够摆脱在

我发现的问题是,在所有版本中,ProgressBar 都会根据“android:alertDialogStyle”中默认定义的内容绘制其背景。

所以为了摆脱额外的层,我必须定义自己的样式并将它们设置为“android:alertDialogStyle”。在这样做时,我还覆盖了应用于 ProgressDialogs 的默认布局。

这是我的主题.xml:

<item name="android:alertDialogTheme">@style/MyAlertDialogTheme</item>
<item name="alertDialogTheme">@style/MyAlertDialogTheme</item>
<item name="android:alertDialogStyle">@style/MyAlertDialogStyles</item>

还有我的styles.xml:

<style name="MyAlertDialogTheme">
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
    <item name="android:background">@color/theme_alert_dialog_background</item>
    <item name="colorAccent">@color/theme_accent_1</item>
</style>

<style name="AlertDialog">
    <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>

【讨论】:

  • 这对我有用。我必须创建两个文件夹(值,值 21)。我在文件夹 values\styles.xml 中实现了解决方案。最后我摆脱了奇怪的边界。完美。
  • 优秀的解决方案。为澄清起见,使用标题为“AlertDialog”的样式作为android:alertDialogStyle,并将其放入您的默认style.xml。我实际上不需要在我的 v21 style.xml 中创建另一种样式。
【解决方案4】:

ProgressDialog - 尝试低于 android 5

dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);

dialog.getWindow().clearFlags(LayoutParams.FLAG_DIM_BEHIND);

【讨论】:

    【解决方案5】:

    您可以下载修订版 22.1.0(几天前更新)并使用android.support.v7.app.AlertDialog

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-25
      • 2015-12-28
      • 2021-07-15
      • 2015-08-26
      • 2023-04-04
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多