2015-04-13 11 views
25

Używam aplikacji AppCompat do pisania aplikacji w stylu projektowania materiałów. Od AppCompat nie wpływa dialogi, jestem skórowania okien dialogowych, takich jak:Skórowanie okna za pomocą AppCompat-v7 22 powoduje brzydkie cienie na api <21

styles.xml:

<style name="AppTheme.Base" parent="Theme.AppCompat"> 
    <!-- Set AppCompat’s color theming attrs --> 
    <item name="colorPrimary">@color/green</item> 
    <item name="colorPrimaryDark">@color/green_darker</item> 
    <item name="colorAccent">@color/accent</item> 

    <item name="android:alertDialogTheme">@style/alertDialog</item> 
    <item name="android:dialogTheme">@style/alertDialog</item> 
</style> 

<style name="alertDialog" parent="Theme.AppCompat.Dialog"> 
    <item name="colorPrimary">@color/green</item> 
    <item name="colorPrimaryDark">@color/green_darker</item> 
    <item name="colorAccent">@color/accent</item> 
</style> 

Jestem gettings dokładnie to, co chciałem na android api> = 21, ale na innych urządzeniach kończę z "pudełkiem" wokół okien dialogowych.

Czy istnieje sposób na pozbycie się "pola" w oknie dialogowym, a nawet uzyskanie kolorów i motywów materiałowych zastosowanych na api < 21, najlepiej bez żadnych dodatkowych dependend?

App na Api < 21:

App on API < 21

App na API> = 21:

App on API >= 21

+0

dla skórowania powiadomienie dialogi trzeba użyć 'androida: Theme.DeviceDefault.Dialog.Alert' (zawsze) natywny wygląd motywu. W przeciwnym razie tło zostanie zduplikowane. W interfejsie API 21 nie widać różnicy, ale podejrzewam, że nastąpi przeciążenie. Skórki jako okna dialogowe używają motywów 'android: Theme.DeviceDefault.Dialog' (wygląd zewnętrzny) lub' Theme.AppCompat.Dialog' (wygląd materiału). –

+0

'Android: Theme.DeviceDefault.Dialog' jest dostępny tylko w API> 14. Czego używam w API 11? – snowdragon

+0

Dodatkowo powoduje to również przekroczenie granicy na apis typu non-Lollipop. [image] (http://i.imgur.com/y0FEsVz.png) – snowdragon

Odpowiedz

32

Z nowym AppCompat v22.1 możesz używać nowego android.support.v7.app.AlertDialog lub nowy AppCompatDialog

Wystarczy użyć kodu takiego (oczywiście w twoim przypadku trzeba użyć niestandardowy układ mieć pasek postępu)

import android.support.v7.app.AlertDialog 

AlertDialog.Builder builder = 
     new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle); 
      builder.setTitle("Dialog"); 
      builder.setMessage("Lorem ipsum dolor ...."); 
      builder.setPositiveButton("OK", null); 
      builder.setNegativeButton("Cancel", null); 
      builder.show(); 

i używać stylu takiego:

<style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert"> 
     <item name="colorAccent">#FFCC00</item> 
     <item name="android:textColorPrimary">#FFFFFF</item> 
     <item name="android:background">#5fa3d0</item> 
    </style> 
+0

Czy wiesz, w jaki sposób możemy zmienić tylko przycisk kursora TextColor i BackgroundColor? – Neige

+0

@Neige Użyj 'builder.getButton (DialogInterface.BUTTON_POSITIVE) .setTextColor (Color.parseColor (" # FF0000 "));' lub '.setBackgroundColor()' lub ... w ten sam sposób po 'builder.show(); '. – Sdghasemi

+8

A dla ProgressDialog? –

6

Miałem dokładnie ten sam problem z nową biblioteką AppCompat 22, gdy używałem android.support.v7.app.AlertDialog dla wszystkich moich AlertDialogów, ale dodatkowe warstwy tła miały wpływ tylko na ProgressDialogs.

Wszystkie moje AlertDialogs, gdy stylizowany przy użyciu mojego niestandardowego motywu wyglądały świetnie, ale ProgressDialog miał dziwną nakładkę w tle, jak opisano w OP.

Moją opcją było ustawienie konkretnego stylu za każdym razem, gdy tworzyłem ProgressBar, ale szukałem szerokiego rozwiązania dla aplikacji.

Z pomocą tych dwóch linków:

How to Style AlertDialogs like a Pro i Joerg Richter Blog udało mi się pozbyć dodatkowej warstwy rysowane na < 21 ProgressDialogs.

Problemem, który znalazłem było to, że we wszystkich wersjach ProgressBar rysuje swoje tło w oparciu o to, co jest zdefiniowane domyślnie w "android: alertDialogStyle".

Aby pozbyć się dodatkowej warstwy, musiałem zdefiniować własne style i ustawić je dla "android: alertDialogStyle". W ten sposób zastępuję również domyślne układy zastosowane do ProgressDialogs.

Oto moje motywy.xml:

<item name="android:alertDialogTheme">@style/MyAlertDialogTheme</item> 
<item name="alertDialogTheme">@style/MyAlertDialogTheme</item> 
<item name="android:alertDialogStyle">@style/MyAlertDialogStyles</item> 

A moja styles.xml:

<style name="MyAlertDialogTheme"> 
    <item name="android:windowIsFloating">true</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</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:background">@color/theme_alert_dialog_background</item> 
    <item name="colorAccent">@color/theme_accent_1</item> 
</style> 

<style name="AlertDialog"> 
    <item name="android:fullDark">@android:color/transparent</item> 
    <item name="android:topDark">@android:color/transparent</item> 
    <item name="android:centerDark">@android:color/transparent</item> 
    <item name="android:bottomDark">@android:color/transparent</item> 
    <item name="android:fullBright">@android:color/transparent</item> 
    <item name="android:topBright">@android:color/transparent</item> 
    <item name="android:centerBright">@android:color/transparent</item> 
    <item name="android:bottomBright">@android:color/transparent</item> 
    <item name="android:bottomMedium">@android:color/transparent</item> 
    <item name="android:centerMedium">@android:color/transparent</item> 
</style> 
+0

To działa dla mnie. Musiałem utworzyć dwa foldery (wartości, wartości-21). Zaimplementowałem rozwiązanie w folderze values ​​\ styles.xml. W końcu pozbyłem się dziwnej granicy. Idealny. – CreateAHero

+0

Doskonałe rozwiązanie. W celu wyjaśnienia użyj stylu "AlertDialog" jako "android: alertDialogStyle" i umieść go w domyślnym pliku 'style.xml'. Właściwie nie musiałem tworzyć innego stylu w moim v21 'style.xml'. – idunnololz

10

na wypadek gdyby ktoś wciąż szuka prostego i skutecznego rozwiązania, po prostu dodaj tę linię do "stylu" alertDialog:

<item name="android:windowBackground">@android:color/transparent</item> 

PS Zmiana tej właściwości wpływa również na okna dialogowe PreferenceFragment w interfejsie API> = 21, więc upewnij się, że używasz różnych stylów: z przezroczystym bg dla API < 21 i bez żadnych zmian dla API> = 21

+0

To jest poprawna odpowiedź. Utwórz motyw rozszerzający jeden z tematów kompatybilności aplikacji i nadpisaj tło okna, jak wspomniano powyżej.Zastosuj motyw w konstrukcji ProgressDialog i nie więcej dziwne tle. –

+0

, że PS jest najważniejszą częścią. Dziękuję Ci! – Kevin

5

ProgressDialog - Wypróbuj poniżej Androida 5

dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); 

lub

dialog.getWindow().clearFlags(LayoutParams.FLAG_DIM_BEHIND); 
Powiązane problemy