2012-12-04 16 views
11

Mam motyw o nazwie "greenhighlight" — ten motyw został wygenerowany przy użyciu Android Action Bar Style Generator i dziedziczy po domyślnym motywie ActionBarSherlock. Kompozycja nie robi nic, oprócz zmiany wyróżnienia na dole paska akcji z niebieskiego na zielony.Jakie atrybuty motywu muszę zastąpić, aby zmienić niebieski kolor podświetlenia w moich oknach dialogowych?

Do tematu wszystkie moje działania, po prostu zrobić:

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

To działa całkiem dobrze dla działań (uwaga zielone podświetlenie na dole ActionBar):

themed Android activity

jednak Mam problemy z dialogami dopasowanymi do moich działań:

default theme Android list dialog

default theme Android progress dialog

Mój „greenhighlight_Dialog” temat jest zdefiniowany jako:

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

mam dziedziczenie z domyślnego motywu dialogowym Sherlocka i przesłanianie pasek postępu przy użyciu pasek postępu styl zdefiniowany przez mój wygenerowany Motyw "greenhighlight" — widać, że pasek postępu jest poprawnym odcieniem zieleni na powyższym zrzucie ekranu.

Aby użyć motywu używam następujący kod:

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

Moim problemem jest to, że nie mam pojęcia, co przypisuje muszę zastąpić. Przeglądałem styles.xml i zgodnie z zaleceniami Styles and Themes doco (co oznacza, że ​​"odwołanie R.style nie jest dobrze udokumentowane i nie opisuje dokładnie stylów") —, ale istnieje wiele zdefiniowanych stylów na Theme.Dialog i nie jestem pewien, które z nich muszę przesłonić, aby uzyskać pożądaną zmianę.

Jakie atrybuty muszę zastąpić, aby w moich oknach dialogowych pojawił się zielony tekst tytułu, zielony pasek pod spodem tytułu i zielony znacznik wyboru dla zaznaczonych elementów listy?

+0

Ładne pytanie. Ale proszę przeczytaj ten wiersz w [ActionBarSherlock - Theming] (http://actionbarsherlock.com/theming.html): * Nie zostaną uwzględnione dodatkowe tematy dialogowe. Jeśli potrzebujesz bardziej zaawansowanych funkcji okien dialogowych, musisz je wprowadzić samemu. * –

+1

@PareshMayani: tak, przeczytałem tę linię - dlatego wdrażam własny motyw dialogowy. – George

Odpowiedz

23

Zacząłem kopać wokół źródła i natknąłem się na plik układu alert_dialog_holo.xml. To jest widok dzielnik:

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

W klasie AlertController, to widoczność jest ustawiona na VISIBLE jeżeli istnieje tytuł obecny. Ponieważ kolor jest zakodowany na stałe, nie ma sposobu na zastąpienie go atrybutem stylu.

To jest widok tytuł:

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

Więc używa windowTitleStyle.Minęło wiele gonić, ale ostatecznie okazało się, że styl, który używa:

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

Po style dominujące powrotem, byłem w stanie zmienić tylko kolor tekstu za pomocą stylów:

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

Teraz Dzielnik, nie można go zmienić za pomocą stylów, ale ponieważ znasz identyfikator, możesz rozszerzyć klasę AlertDialog i przechwycić ją, gdy tworzy swój układ (onCreate) i zmieniać jego kolor. Chociaż jest to obsługiwane w prywatnej klasie AlertController, więc nie jestem pewien, ile masz szczęścia. Przyjrzę się temu bardziej i wrócę, jeśli coś wymyślę.

+0

Witam jason, dziękuję za tak wspaniałą pracę. Działa to dobrze dla wszystkich innych rzeczy, takich jak zmiana koloru tekstu nagłówka itp., Ale kiedy próbowałem zmienić wysokość dzielnika nagłówka lub kolor dzielnika, jest on odzwierciedlany w widoku. czy możesz wytłumaczyć jak to zrobić .. potrzebujesz pomocy ... dziękuję ... – nilkash

+1

@nilkash, W końcu udało mi się obejść to, żeby nie ustawić tytułu i użyć niestandardowego układu wiadomości. W moim niestandardowym układzie wiadomości utworzyłem własny dzielnik, który pasuje do mojego motywu. –

+0

@pegisys dziękuję odpowiedź. Ale nie wiem, czy mogę zmienić kolor dzielnika, aby pasowały do ​​mojej aplikacji. Zrobiłem wiele rzeczy, ale nie byłem w stanie tego zrobić. głównie dla okna kontekstowego i okna dialogowego. Jestem w stanie zmienić tekst i usłyszeć tekst lub ustawić niestandardowy nagłówek dla kontekstu, ale wciąż nie mogę zmienić koloru dzielnika nagłówka ... Potrzebuję pomocy Dziękuję ... – nilkash

2

znalazłem rozwiązanie do usuwania dzielnik: wystarczy dodać następującą linię w stylu dialogowym zwyczaj ostrzegania (patrz AlertDialogStyle w odpowiedzi Jasona Robinsona):

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

Następnie dzielnik będzie zniknął.

Jeśli nadal chcesz dodać niestandardową przegrodę, możesz dodać ją do niestandardowego układu treści.

Powiązane problemy