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,但它没有很多自定义。事实上,它只支持颜色,我不确定如何设置文本颜色(标题和/或消息)。

4

2 回答 2

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

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

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

更新:

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

顺便说一句,我不确定这是否是您的情况,但是如果您为 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);
于 2013-05-16T17:35:13.870 回答
1

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

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

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

于 2013-05-26T09:16:59.610 回答