ActionBarSherlock不支持浅色主题的警告对话框?

4

正如标题所述,我正在使用actionBarSherlock库和一个浅色主题,有时需要使用alertDialog.Builder类显示对话框。

问题是,无论我尝试什么,主题都不适用于对话框本身。该主题应适用于新API和旧API(在蜂窝版本之前)。

示例:

代码:

final AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(activity,
            R.style.AppTheme_LightDialog));

或者:

final AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(activity,
            R.style.Theme_Sherlock_Light_Dialog));

xml:

<style name="AppTheme_LightDialog" parent="@android:style/Theme.Light">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowTitleStyle">@style/DialogWindowTitle.Sherlock.Light</item>
    <item name="android:windowBackground">@drawable/abs__dialog_full_holo_light</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowActionModeOverlay">true</item>
    <item name="android:windowCloseOnTouchOutside">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:backgroundDimAmount">0.6</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:textColorPrimary">@color/abs__primary_text_holo_light</item>
    <item name="android:textColorPrimaryInverse">@color/abs__primary_text_holo_dark</item>
    <item name="windowMinWidthMajor">@dimen/abs__dialog_min_width_major</item>
    <item name="windowMinWidthMinor">@dimen/abs__dialog_min_width_minor</item>
    <item name="windowActionBar">false</item>
    <item name="windowContentOverlay">@null</item>
    <item name="android:textAppearance">?android:attr/textAppearanceInverse</item>
</style>

我知道可以使用DialogFragment,但还有其他方法吗?对话框非常简单,而且由于它们很多,更改所有对话框会很麻烦。


编辑:我可能错了,但是使用android:alertDialogStyle属性(在这里显示)似乎会改变旧API的样式,但它没有太多自定义选项。实际上,它只支持颜色,我不确定如何设置标题和/或消息的文本颜色。


ABS并不是为了提供对话框主题,他们甚至在最新版本中删除了对话框主题。尝试使用HoloEverywhere,我相信他们支持对话框主题。 - stoilkov
@stoilkov 你确定吗?他们有 DialogFragment,它是否具有相同的样式(或者是否有)?为什么不能将相同的内容应用于普通对话框?它们有那么大的不同吗? - android developer
对话框主题的原因是它们没有操作栏,这就是为什么它们不在库范围之内而被删除的。您应该能够使用已删除提交的内容创建类似的效果。[来源](https://github.com/JakeWharton/ActionBarSherlock/commit/601bde214b56b8fad0b4fc5aaed5af0b531b6135) - Alejandro Colorado
@IlyaKogan 很遗憾,我被告知要放手不管,稍后再处理。然而,由于我已经设置了赏金,如果有人说他成功了,我会尝试一下,如果真的有效,我会给予奖励... - android developer
不,它有很多错误。只有在将最新的官方支持库添加到actionBarSherlock后才能正常工作。它大部分没有XML文件,而且代码很多。从中仅提取感兴趣的部分而不获取更多库中的内容非常困难。这就像多米诺骨牌效应-一旦你拿了一个,可能也需要其他的。我花了一整天来“剖析”它。 - android developer
显示剩余6条评论
2个回答

3

经过一些研究,我认为这不是ActionBarScherlock的问题,而是警告对话框中的浅色主题问题。让我们尝试一些方法:

使用:

final AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(activity, R.style.AppTheme_LightDialog));

更改:

<style name="AppTheme_LightDialog" parent="@android:style/Theme.Light">

至:

<style name="AppTheme_LightDialog" parent="@android:style/Theme.Dialog">

然后覆盖默认的“Theme.Dialog”样式(从Android git树中复制粘贴):
<style name="AppTheme_LightDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowTitleStyle">@android:style/DialogWindowTitle</item>
    <item name="android:windowBackground">@android:drawable/panel_background</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
</style>

你可能需要将原始资源 (@android:style/DialogWindowTitle, @android:style/Animation.Dialog 和 @android:drawable/panel_background) 复制到你的项目中。
最后,有点棘手 (来自Shawn Castrianni的链接),因为似乎Android需要一些额外的帮助才能正确地将样式应用于AlertDialog的文本。在你的 "AppTheme_LightDialog" 样式中添加:
<item name="android:textColor">?android:attr/textColorPrimaryInverseDisableOnly</item>

更新:

在蜂巢版本之前,似乎文本样式并没有真正应用于AlertDialog。上面的代码提供了一个解决方案,适用于>=Honeycomb设备。还有一个有趣的解决方法可以让它在这些设备上工作(请查看thisthis),但您可能希望开始思考是否需要采用不同的方法来减少工作量。

顺便说一句,我不确定这是否符合您的情况,但如果您为AlertDialog填充自定义布局,则也需要使用相同的ContextThemeWrapper。例如:

更改:

View view = View.inflate(activity, R.layout.myDialog, null);

To:

View view = View.inflate(new ContextThemeWrapper(activity, R.style.AppTheme_LightDialog), R.layout.myDialog, null);

我现在从http://code.google.com/p/bankdroid/source/browse/trunk/bankdroid.soda/res/drawable/panel_background.xml?r=222获取了panel_background,该样式可在android-sdk\platforms\android-16\data\res\values\styles.xml中使用。Animation.Dialog不是必需的。尽管如此,在所有这些操作之后,它仍然无法在Android 2.3设备上运行(特别是Galaxy S2和Galaxy Mini,它们具有自己定制的主题对话框)。 - android developer
那么它不适用于蜂巢之前的版本,我需要使用自定义解决方案?太糟糕了。我甚至尝试过Holoeverywhere库,虽然它在他们的示例应用程序中可以工作,但是它有大量文件,我不确定如何使用它以及是否可能仅从其中获取对话框部分。 - android developer
我明白了。你能否请提供一个关于它在蜂窝版本之前不可用的链接? - android developer
请查看以下链接:
  • 这里
  • 这里
  • 这里
- Alejandro Colorado
为什么默认的 alertDialog 构建器也不能工作呢?它也使用简单的视图和布局,不是吗? - android developer
显示剩余17条评论

1
这就是我所做的,它使对话框的主体变为白色。标题仍然在黑色背景上:
new AlertDialog.Builder(
    new ContextThemeWrapper(
        activity,
        R.style.Theme_Sherlock_Light));

我还尝试了Theme_Sherlock_Light_NoActionBar,但好像没有任何区别。


你尝试在旧版的安卓上运行过吗?我已经尝试过了,但没有帮助。也许是因为我的全局文本颜色设置为白色? - android developer
是的,我在2.3.6上测试所有东西。 - Ilya Kogan
我会测试一下。为了一个进度对话框,我该怎么做?我认为它有同样的问题。 - android developer
我已经在一台安装有Android 2.3.5版本的Galaxy S2设备上进行了测试,但它并没有起作用。它显示了一个黑色的警告对话框。 - android developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接