Какие атрибуты темы мне нужно переопределить, чтобы изменить синий цвет подсветки моих диалоговых окон?

у меня есть тема под названием "greenhighlight" - эта тема была создана с помощью Генератор Стиля Панели Действий Android, и наследует от темы ActionBarSherlock по умолчанию. Тема ничего не делает, кроме изменения подсветки в нижней части верхней панели с синего на зеленый.

В тему все мои действия, я просто делаю:

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

это работает довольно хорошо для деятельности (обратите внимание на зеленую подсветку в нижней части Верхней панели):

themed Android activity

тем не менее, мне трудно тематизировать мои диалоги, чтобы соответствовать моей деятельности:

default theme Android list dialog

default theme Android progress dialog

моя "тема greenhighlight_Dialog" определяется как:

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

Я наследую от темы диалога Шерлока по умолчанию и переопределяю индикатор выполнения, используя стиль индикатора выполнения, определенный моей сгенерированной темой "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);
...

моя проблема заключается в том, что я понятия не имею, какие атрибуты мне нужно переопределить. Я просматривал стили.в XML и темы.в XML рекомендовано стили и темы doco (который отмечает ,что "ссылка на R. style, однако, не хорошо документирована и не полностью описывает стили") - но есть много стилей определено по теме.Диалог, и я не уверен, какие из них мне нужно переопределить, чтобы получить изменения, которые я хочу.

какие атрибуты мне нужно переопределить, чтобы мои диалоги имели зеленый текст заголовка, зеленую панель подсветки под заголовком и зеленые флажки для элементов проверенного списка?

2 ответов


я пошел копать вокруг источника и наткнулся на 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>

теперь для разделителя вы не можете изменить его через стили, но поскольку вы знаете идентификатор, вы можете расширить AlertDialog class и перехватить его, когда он создает свой макет (onCreate) и изменить его цвет. Хотя это обрабатывается в частном AlertController класс, поэтому я не уверен, насколько Вам ПОВЕЗЕТ. Я разберусь с этим и вернусь, если что-нибудь придумаю. что угодно.


Я нашел решение для удаления разделителя: просто добавьте следующую строку в свой пользовательский стиль диалога оповещения (см. AlertDialogStyle в ответе Джейсона Робинсона):

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

тогда делитель исчезнет.

Если вы все еще хотите добавить пользовательский разделитель, вы можете добавить его в свой пользовательский макет контента.