2015-10-13 9 views
7

Chcę dostosować okno alertu w mojej aplikacji dla Androida, więc zacząłem zmieniając atrybut alertDialogTheme z moich aplikacji tematu następująco:Dialog Niestandardowe Alert dziwne patrząc na Android 4.x

RES/wartości/themes .xml

<resources> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <item name="android:alertDialogTheme">@style/AlertDialogTheme</item> 
    </style> 

    <style name="AlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert"/> 
</resources> 

Tylko robiąc to, że nie oczekuje się, że dialog wyglądać inaczej od normy, ponieważ nowy motyw AlertDialogTheme jest dokładnie taka sama jak jego rodzica. To działało poprawnie na Androidzie Lollipop, ale w Androidzie Kitkat za oknem dialogowym pojawia się biały prostokąt. Oto jak to wyglądało:

enter image description here

Czy robię coś źle? Może używając niewłaściwego rodzica?

Dzięki!

+0

Wystarczy ustawić tło jako przezroczyste. – zgc7009

+0

@ zgc7009 Tak, działa na KitKat, ale potem całe okno staje się przezroczyste na Lollipop. Mógłbym utworzyć dwa pliki XML, po jednym dla każdego API, ale jeśli jest inny sposób, chciałbym, żeby to było proste. – Milack27

+1

Dlaczego nie używasz biblioteki AppCompat razem z 'AlertDialogCompat'? –

Odpowiedz

13

Dzieje się tak, ponieważ używasz AlertDialog zamiast stosunkowo nowego AlertDialogCompat. Ten przynosi takie same dialogi stylu Material Design na wszystkich platformach i jest bardzo zachęcany do jego używania.

Aby z niego skorzystać, trzeba mieć pewność, że w Gradle plik masz następującą linię wewnątrz swoimi zależnościami.

com.android.support:appcompat-v7:24.2.1
(ten jest najnowsza wersja Upewnij się, że wszystkie pakiety aktualizowane przez patrząc Menedżer SDK).

Następnie w Aktywności, w której chcesz ją wyświetlić, należy zaimportować android.support.v7.app.AlertDialog i użyć AlertDialog.Builder dokładnie tak, jak było to wcześniej używane.

+0

Uważam, że to pytanie zostało odebrane, chociaż pojawiły się dalsze problemy. Korzystając z klasy wsparcia dla AlertDialog, personalizacja zostaje ograniczona, ponieważ atrybuty kolorów, takie jak topDark, przestają działać, albo są umieszczane wewnątrz alertDialogTheme lub alertDialogStyle. Tego samego rozwiązania nie można zastosować do DatePickerDialog i TimePickerDialog, o ile te klasy nie mają do tej pory wersji wsparcia. – Milack27

+0

Dla tych przypadków powinieneś nadal używać domyślnych ustawień Data i godzina zawartych w każdym interfejsie API lub użyć [nieoficjalnego ich wstecznego portu] (https://github.com/SimonVT/android-numberpicker). –

+0

Nieoficjalny port może działać, nigdy ich nie próbowałem. Ale te domyślne będą miały ten sam problem. – Milack27

2

Naprawiłem go za pomocą poniższego kodu:

<style name="CustomAppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert"> 
    <item name="android:windowBackground">@android:color/transparent</item> 
</style> 
+0

To właśnie zgz7009 zasugerowało w pierwszym komentarzu. Działa, jeśli zdefiniuję dwa style XML, po jednym dla każdego API. Jeśli nie, okna dialogowe będą wyglądać dziwnie na Androidzie Lollipop. Myślę, że rozwiązanie Joaquina jest jednak o wiele prostsze. – Milack27

Powiązane problemy