正如标题所说,我正在使用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,但还有另一种方法吗?对话框非常简单,因为它们中有很多,所以更改它们会很烦人。
答案 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设备的解决方案。有一个有趣的解决方法是让它在这些设备中工作(检查this和this),但是你可能想开始问你是否更喜欢一种需要更少工作的不同方法。
顺便说一句,我不确定这是不是你的情况,但是如果你为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
,但似乎没有任何区别。