使用 AppCompat-v7 22 的对话框皮肤会在 api < 21 上产生难看的阴影
Dialog skinning with AppCompat-v7 22 results in ugly shadows on api < 21
我正在使用 AppCompat 编写一个 material 设计风格的应用程序。由于 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 上得到的正是我想要的,但在其他设备上,我最终在对话框周围出现 "box"。
有没有办法摆脱对话框周围的 "box",甚至在 api < 21 上应用颜色和 material 主题,最好不要有任何额外的依赖项?
应用在 Api < 21:
API 上的应用 >= 21:
您可以下载修订版 22.1.0(几天前更新)并使用 android.support.v7.app.AlertDialog
有了新的 AppCompat v22.1
,您可以使用新的 android.support.v7.app.AlertDialog or the new 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>
我在对所有 AlertDialogs 使用 android.support.v7.app.AlertDialog 时遇到了与新 AppCompat 22 库完全相同的问题,但额外的背景层仅影响 ProgressDialogs。
我所有的 AlertDialogs 在使用我的自定义主题设置样式时看起来都很棒,但是 ProgressDialog 在背景上有奇怪的覆盖,如 OP 中所述。
我的一个选择是在每次构建 ProgressBar 时设置特定的样式,但我一直在寻找应用程序范围的解决方案。
借助这两个链接:
How to Style AlertDialogs like a Pro and Joerg Richter Blog 我能够摆脱在 < 21 ProgressDialogs 上绘制的额外图层。
我发现的问题是,在所有版本中,ProgressBar 根据 "android:alertDialogStyle" 中默认定义的内容绘制背景。
所以为了摆脱额外的层,我必须定义自己的样式并为 "android:alertDialogStyle" 设置它们。这样做时,我还覆盖了应用于 ProgressDialogs 的默认布局。
这是我的 themes.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>
如果有人仍在寻找简单有效的解决方案,只需将此行添加到您的 "alertDialog" 样式中:
<item name="android:windowBackground">@android:color/transparent</item>
P.S。更改此 属性 也会影响 API >= 21 上的 PreferenceFragment 对话框,因此请确保您使用不同的样式:API < 21 使用透明背景,[=17 不做任何更改=] >= 21
ProgressDialog - 尝试以下 android 5
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
或
dialog.getWindow().clearFlags(LayoutParams.FLAG_DIM_BEHIND);
我正在使用 AppCompat 编写一个 material 设计风格的应用程序。由于 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 上得到的正是我想要的,但在其他设备上,我最终在对话框周围出现 "box"。
有没有办法摆脱对话框周围的 "box",甚至在 api < 21 上应用颜色和 material 主题,最好不要有任何额外的依赖项?
应用在 Api < 21:
API 上的应用 >= 21:
您可以下载修订版 22.1.0(几天前更新)并使用 android.support.v7.app.AlertDialog
有了新的 AppCompat v22.1
,您可以使用新的 android.support.v7.app.AlertDialog or the new 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>
我在对所有 AlertDialogs 使用 android.support.v7.app.AlertDialog 时遇到了与新 AppCompat 22 库完全相同的问题,但额外的背景层仅影响 ProgressDialogs。
我所有的 AlertDialogs 在使用我的自定义主题设置样式时看起来都很棒,但是 ProgressDialog 在背景上有奇怪的覆盖,如 OP 中所述。
我的一个选择是在每次构建 ProgressBar 时设置特定的样式,但我一直在寻找应用程序范围的解决方案。
借助这两个链接:
How to Style AlertDialogs like a Pro and Joerg Richter Blog 我能够摆脱在 < 21 ProgressDialogs 上绘制的额外图层。
我发现的问题是,在所有版本中,ProgressBar 根据 "android:alertDialogStyle" 中默认定义的内容绘制背景。
所以为了摆脱额外的层,我必须定义自己的样式并为 "android:alertDialogStyle" 设置它们。这样做时,我还覆盖了应用于 ProgressDialogs 的默认布局。
这是我的 themes.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>
如果有人仍在寻找简单有效的解决方案,只需将此行添加到您的 "alertDialog" 样式中:
<item name="android:windowBackground">@android:color/transparent</item>
P.S。更改此 属性 也会影响 API >= 21 上的 PreferenceFragment 对话框,因此请确保您使用不同的样式:API < 21 使用透明背景,[=17 不做任何更改=] >= 21
ProgressDialog - 尝试以下 android 5
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
或
dialog.getWindow().clearFlags(LayoutParams.FLAG_DIM_BEHIND);