7

我想更改 AlertDialog ( Holo Theme )中的蓝色标题和蓝线的颜色,我可以通过查看 android styles.xml 和 theme.xml 来更改标题的颜色,但我找不到任何属性或样式我可以使用/更改来更改我的 XML 的颜色。

以下是我用来更改标题颜色的样式

<style name="myAlertDialog" parent="android:Theme.Holo.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowTitleStyle">@style/myAlertDialogTitleStyle</item>
</style>

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

<style name="myAlertDialogTitleStyleTextAppearance">
    <item name="android:textSize">22sp</item>
    <item name="android:textColor">#ffff8800</item>
</style>
4

3 回答 3

4

经过一番修修补补,我想出了一种在显示对话框时重新命名对话框的方法:

private AlertDialog showWithThemeColors() {
    Log.d(TAG, "showWithThemeColors()");
    AlertDialog dialog = this.builder.show();
    try {
        ViewGroup decorView = (ViewGroup) dialog.getWindow().getDecorView();
        FrameLayout windowContentView = (FrameLayout) decorView.getChildAt(0);
        FrameLayout contentView = (FrameLayout) windowContentView.getChildAt(0);
        LinearLayout parentPanel = (LinearLayout) contentView.getChildAt(0);
        LinearLayout topPanel = (LinearLayout) parentPanel.getChildAt(0);
        View titleDivider = topPanel.getChildAt(2);
        LinearLayout titleTemplate = (LinearLayout) topPanel.getChildAt(1);
        TextView alertTitle = (TextView) titleTemplate.getChildAt(1);

        int textColor = this.context.getResources().getColor(R.color.customer_text_on_primary);
        alertTitle.setTextColor(textColor);

        int primaryColor = this.context.getResources().getColor(R.color.customer_primary);
        titleDivider.setBackgroundColor(primaryColor);
    } catch (Exception e) {
        Log.e(TAG, "showWithThemeColors() - Could not re-brand dialog with theme colors.", e);
    }

    return dialog;
}

请注意,此解决方案可能会在对话框的基础系统布局发生更改时中断。然而,它是具有这种解决方案所有优点的原始系统对话框。

于 2013-08-26T11:14:05.763 回答
4

编辑:我原来的答案弄错了。

不幸的是,用于对话框的样式是内部的,不能以与其他一些易于操作的全息元素相同的方式使用。我已经创建了一个开源项目,用于在非常简单的情况下处理此问题(我希望将其扩展并使其更加合法)。这是一个新答案的链接,该答案更深入地解决了这个问题:如何更改 AlertDialog 标题的颜色及其下方线条的颜色


对于后代,这是我天真的旧答案:

看看这里发布的答案。对于您的特定目标,您将希望覆盖dialogTitleDecorLayout样式(我认为!)而不是listSeparatorTextViewStyle样式。

如果你好奇这个最初是在哪里设置的,你可以在你电脑上的 android sdk 文件夹中的themes.xml 文件中翻找并搜索dialogTitleDecorLayout属性。这应该会引导您进入一个dialog_title_holo布局文件,该文件也应该在您的计算机上。您应该在布局中找到以下代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:fitsSystemWindows="true">
  <TextView android:id="@android:id/title" style="?android:attr/windowTitleStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="60dip"
    android:paddingLeft="32dip"
    android:paddingRight="32dip"
    android:gravity="center_vertical|left" />
  <ImageView android:id="@+id/titleDivider"
        android:layout_width="match_parent"
        android:layout_height="4dip"
        android:scaleType="fitXY"
        android:gravity="fill_horizontal"
        android:paddingLeft="16dip"
        android:paddingRight="16dip"
        android:src="@android:drawable/divider_strong_holo" />
  <FrameLayout
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="vertical"
    android:foreground="?android:attr/windowContentOverlay">
    <FrameLayout android:id="@android:id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
  </FrameLayout>
</LinearLayout>

注意的代码是@android:drawable/divider_strong_holo参考。此文件也存在于您的计算机上,它应该是蓝色的 9patch。您将需要创建一个类似的不同颜色的 9patch。祝你好运!即使这不是完全正确的属性,我认为您也看到了您可能需要在这里做的事情......

于 2012-09-05T07:27:18.330 回答
1

有一个库可以为您的所有对话框执行此操作:

https://github.com/inmite/android-styled-dialogs

于 2013-06-12T19:45:26.347 回答