ActionBarSherlock不支持光主题警报对话框?

时间:2013-05-16 15:25:46

标签: android actionbarsherlock android-alertdialog android-theme

正如标题所说,我正在使用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属性(显示为here)会更改旧API,但它没有很多自定义。事实上,它只支持颜色,我不知道如何设置文本颜色(标题和/或消息)。

2 个答案:

答案 0 :(得分:3)

经过研究,我认为这不是ActionBarScherlock问题,而是警报对话框中的Light Theme问题。让我们尝试一些事情:

使用:

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)复制到您的项目中。

最后,棘手的部分(from Shawn Castrianni),因为看起来Android需要一些额外的帮助来正确地将样式应用于AlertDialog的文本。添加到“AppTheme_LightDialog”样式:

<item name="android:textColor">?android:attr/textColorPrimaryInverseDisableOnly</item>

更新:

似乎在Honeycomb之前,文本样式实际上并未应用于AlertDialogs。上面的代码为您提供了&gt; = Honeycomb设备的解决方案。有一个有趣的解决方法是让它在这些设备中工作(检查thisthis),但是你可能想开始问你是否更喜欢一种需要更少工作的不同方法。

顺便说一句,我不确定这是不是你的情况,但是如果你为AlertDialog充气自定义布局,那么你也要使用相同的ContextThemeWrapper。例如,

变化:

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

要:

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

答案 1 :(得分:1)

这就是我所做的,它使对话框的主体变白了。标题仍然是黑色背景:

new AlertDialog.Builder(
    new ContextThemeWrapper(
        activity,
        R.style.Theme_Sherlock_Light));

我也试过Theme_Sherlock_Light_NoActionBar,但似乎没有任何区别。