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

У меня есть тема под названием "greenhighlight" — эта тема была сгенерирована с помощью Генератор стилей Android Action и наследуется от темы ActionBarSherlock по умолчанию. Тема ничего не делает, кроме изменения подсветки в нижней части ActionBar от синего до зеленого.

Для темы всех моих действий, я просто делаю:

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

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

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);
...

Моя проблема в том, что я понятия не имею, какие атрибуты мне нужно переопределить. Я просматривал styles.xml и themes.xml как рекомендовано Styles and Themes doco (что отмечает, что ссылка R.style, однако, не хорошо документирована и не описывает полностью стили ") — но существует множество стилей, определенных в Theme.Dialog, и я не уверен, какие из них мне нужно переопределить, чтобы получить требуемое изменение.

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

Ответ 1

Я пошел копаться вокруг источника и наткнулся на файл макета 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, если присутствует название. Поскольку цвет жестко закодирован, не будет способа перезаписать это с помощью атрибута style.

Это название:

<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 и перехватить его, когда он создаст свой макет (onCreate) и изменит его цвет. Хотя это обрабатывается в частном классе AlertController, поэтому я не уверен, насколько вам повезет. Я посмотрю на это больше и вернусь, если придумаю что-нибудь.

Ответ 2

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

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

Затем разделитель исчезнет.

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