2012-12-04 5 views
11

Ich habe ein Thema namens "greenhighlight" — Dieses Thema wurde mit der Android Action Bar Style Generator generiert und erbt von der Standard ActionBarSherlock Thema. Das Thema macht nichts, außer dass die Markierung am unteren Rand der ActionBar von Blau zu Grün wechselt.Welche Motivattribute muss ich überschreiben, um die blaue Hervorhebungsfarbe meiner Dialoge zu ändern?

Zum Thema alle meine Aktivitäten, das tue ich gerade:

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

Dies funktioniert für Aktivitäten ziemlich gut (man beachte die grüne Markierung auf der Unterseite des ActionBar):

themed Android activity

jedoch , Habe ich Schwierigkeiten, meine Dialoge passend zu meinen Aktivitäten zu gestalten:

default theme Android list dialog

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

Ich vererben Sherlock aus dem Standard-Dialog Thema, und das Überschreiben der Fortschrittsbalken den Fortschrittsbalken Stil mit, wie meine erzeugt definiert:

default theme Android progress dialog

Mein „greenhighlight_Dialog“ Thema ist definiert als "greenhighlight" Thema — Sie können sehen, dass der Fortschrittsbalken der richtige Farbton grün in der obigen Screenshot ist.

das Thema zu verwenden, ich den folgenden Code ausführen:

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

Mein Problem ist, dass ich keine Ahnung habe, was ich brauche außer Kraft zu setzen Attribute. Ich habe durch styles.xml und themes.xml wie von der Styles and Themes Doco empfohlen (die feststellt, dass "die R.Style-Referenz jedoch nicht gut dokumentiert ist und die Stile nicht gründlich beschreibt") —, aber es gibt eine Menge von Stilen definiert auf Theme.Dialog und ich bin unsicher, welche ich überschreiben muss, um die Änderung zu erhalten, die ich will.

Welche Attribute muss ich überschreiben, damit meine Dialoge einen grünen Titeltext, eine grüne Hervorhebungsleiste unter dem Titel und grüne Häkchen für überprüfte Listenelemente haben?

+0

Schöne Frage. Aber lies bitte diese Zeile unter [ActionBarSherlock - Theming] (http://actionbarsherlock.com/theming.html): * Es werden keine zusätzlichen Dialogthemen hinzugefügt. Wenn Sie einige der erweiterten Funktionen von Dialogen benötigen, müssen sie selbst implementiert werden. * –

+1

@PareshMayani: Ja, ich habe diese Zeile gelesen - deshalb implementiere ich mein eigenes Dialogthema. – George

Antwort

23

Ich ging graben um die Quelle und stieß auf die alert_dialog_holo.xml Layout-Datei. Dies ist die Teiler Ansicht:

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

In der AlertController Klasse, es ist die Sichtbarkeit zu VISIBLE gesetzt, wenn ein Titel vorhanden ist. Da die Farbe fest codiert ist, gibt es keine Möglichkeit, dies mit einem Stilattribut zu überschreiben.

Dies ist die Titelansicht:

<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" /> 

So verwendet er die windowTitleStyle.Es dauerte eine Menge stürmte, aber ich fand schließlich den Stil, der verwendet:

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

die Stile Eltern Nach zurück, ich konnte über Stile nur die Textfarbe ändern:

<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> 

Jetzt für Der Teiler kann nicht über Stile geändert werden, aber da Sie die ID kennen, können Sie die Klasse AlertDialog erweitern und abfangen, wenn sie ihr Layout (onCreate) erstellt und ihre Farbe ändert. Obwohl dies in der privaten AlertController Klasse behandelt wird, bin ich mir nicht sicher, wie viel Glück Sie haben werden. Ich schaue mir das genauer an und komme zurück, wenn mir etwas einfällt.

+0

Hallo jason danke für so eine tolle Arbeit .. Es funktioniert gut für alle anderen Sachen wie Header Textfarbe und etc. ändern, aber wenn ich versucht, Header Teiler Höhe oder Farbe der Teiler zu ändern, wird es in Sicht reflektiert. Kannst du plz erklären, wie man das macht ... brauche Hilfe ... danke ... – nilkash

+1

@nilkash, Was ich getan habe, um dies zu umgehen, war, den Titel nicht zu setzen und ein benutzerdefiniertes Nachrichtenlayout zu verwenden. In meinem benutzerdefinierten Nachrichtenlayout habe ich meinen eigenen Teiler erstellt, der zu meinem Thema passt. –

+0

@pegisys danke antworten. Aber ich weiß nicht, dass ich diese Teilerfarbe überschreiben soll, um sie mit meiner App zu vergleichen. Ich habe viele Sachen gemacht, aber das war nicht möglich. hauptsächlich für Kontextfenster und Dialog. Ich bin in der Lage, Text zu ändern und Text zu hören oder benutzerdefinierten Header für den Kontext, aber immer noch nicht in der Lage Farbe der Header-Teiler zu ändern ... Brauchen Sie Ihre Hilfe Vielen Dank ... – nilkash

2

fand ich eine Lösung, die die Teiler zu entfernen: nur die folgende Zeile in Ihrem benutzerdefinierten Warndialogstil hinzufügen (zu AlertDialogStyle in Jason Robinson Antwort entnehmen Sie bitte):

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

Dann wird der Teiler gegangen.

Wenn Sie immer noch einen benutzerdefinierten Teiler hinzufügen möchten, können Sie ihn in Ihrem benutzerdefinierten Inhaltslayout hinzufügen.

Verwandte Themen