11

我有一个名为“greenhighlight”的主题——这个主题是使用Android Action Bar Style Generator 生成的,并且继承自默认的 ActionBarSherlock 主题。除了将 ActionBar 底部的突出显示从蓝色更改为绿色外,该主题没有任何作用。

为了主题化我的所有活动,我只做:

<application android:theme="@style/Theme.greenhighlight"...

这对活动非常有效(注意 ActionBar 底部的绿色突出显示):

主题安卓活动

但是,我很难将我的对话主题化以匹配我的活动:

默认主题 Android 列表对话框

默认主题 Android 进度对话框

我的“greenhighlight_Dialog”主题定义为:

<style name="greenhighlight_Dialog" parent="@style/Theme.Sherlock.Dialog">
    <item name="android:progressBarStyleHorizontal">
        @style/greenhighlight_ProgressBar
    </item>
</style>

我继承了默认的 Sherlock 对话框主题,并使用由我生成的“greenhighlight”主题定义的进度条样式覆盖进度条——您可以在上面的屏幕截图中看到进度条是正确的绿色阴影。

要使用主题,我正在运行以下代码:

ContextThemeWrapper ctw = 
    new ContextThemeWrapper(this, R.style.greenhighlight_Dialog);
AlertDialog.Builder builder = new AlertDialog.Builder(ctw);
...
ProgressDialog pd = new ProgressDialog(this, R.style.greenhighlight_Dialog);
...

我的问题是我不知道我需要覆盖哪些属性。我一直在按照Styles and Themes doco推荐的方式查看styles.xmltheme.xml(其中指出“R.style 参考,然而,没有很好的文档记录,也没有彻底描述样式”)——但是那里在 Theme.Dialog 上定义了很多样式,我不确定我需要覆盖哪些样式才能获得我想要的更改。

我需要覆盖哪些属性才能使我的对话框具有绿色标题文本、标题下方的绿色高亮条和选中列表项的绿色复选标记?

4

2 回答 2

23

我去挖掘源代码并遇到了alert_dialog_holo.xml布局文件。这是分隔线视图:

<View android:id="@+id/titleDivider"
    android:layout_width="match_parent"
    android:layout_height="2dip"
    android:visibility="gone"
    android:background="@android:color/holo_blue_light" />

在类中,如果存在标题AlertController,则其可见性设置为。VISIBLE由于颜色是硬编码的,所以没有办法用样式属性覆盖它。

这是标题视图:

<com.android.internal.widget.DialogTitle android:id="@+id/alertTitle"
    style="?android:attr/windowTitleStyle"
    android:singleLine="true"
    android:ellipsize="end"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

所以它使用windowTitleStyle. 追了很多,但我最终找到了使用的风格:

<style name="TextAppearance.Holo.DialogWindowTitle">
    <item name="android:textSize">22sp</item>
    <item name="android:textColor">@android:color/holo_blue_light</item>
</style>

继父样式返回后,我只能通过样式更改文本颜色:

<style name="AppTheme" parent="@android:style/Theme.Holo">
    <item name="android:alertDialogTheme">@style/AlertDialogStyle</item>
</style>

<style name="AlertDialogStyle" parent="@android:style/Theme.Holo.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</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:windowTitleStyle">@style/DialogWindowTitle</item>
</style>

<style name="DialogWindowTitle">
    <item name="android:maxLines">1</item>
    <item name="android:scrollHorizontally">true</item>
    <item name="android:textAppearance">@style/DialogWindowTitleAppearance</item>
</style>

<style name="DialogWindowTitleAppearance" parent="@android:style/TextAppearance.Holo.DialogWindowTitle">
    <item name="android:textColor">#00ff00</item>
</style>

现在对于分隔线,您无法通过样式更改它,但由于您知道 id,您可以扩展AlertDialog该类并在它创建其布局 (onCreate) 并更改它的颜色时拦截它。虽然这是在私人AlertController课程中处理的,所以我不确定你会有多少运气。如果我想出任何东西,我会更多地研究并回来。

于 2012-12-07T21:57:19.887 回答
2

我找到了删除分隔符的解决方案:只需在您的自定义警报对话框样式中添加以下行(请参阅 Jason Robinson 的答案中的 AlertDialogStyle):

    <item name="android:divider">@null</item>"

然后分隔线将消失。

如果您仍想添加自定义分隔线,可以将其添加到自定义内容布局中。

于 2013-08-14T06:09:52.970 回答