2015-10-13 26 views
7

voglio personalizzare la finestra di avviso nella mia app Android, così ho iniziato cambiando l'attributo alertDialogTheme del tema di mia app come segue:dialogo avviso personalizzato cercando di strano su Android 4.x

res/valori/temi .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> 

Solo facendo questo, non mi aspettavo la finestra a guardare in modo diverso dallo standard, perché il nuovo tema AlertDialogTheme è esattamente lo stesso come il suo genitore. Ha funzionato correttamente su Android Lollipop, ma in Android Kitkat appare un rettangolo bianco dietro la finestra di dialogo. Ecco come sembrava:

enter image description here

Sto facendo qualcosa di sbagliato? Forse usare il genitore sbagliato?

Grazie!

+0

Basta impostare lo sfondo trasparente. – zgc7009

+0

@ zgc7009 Sì, funziona su Kitkat, ma l'intero dialogo diventa trasparente su Lollipop. Potrei creare due file XML, uno per ogni API, ma se c'è un altro modo, vorrei semplicemente mantenerlo semplice. – Milack27

+1

Perché non usi la libreria AppCompat insieme a 'AlertDialogCompat'? –

risposta

13

Questo accade perché si utilizza AlertDialog anziché il relativamente nuovo AlertDialogCompat. Questo porta le stesse finestre di dialogo di stile Material Design su tutte le piattaforme ed è altamente incoraggiato il suo uso.

Per utilizzarlo, è necessario essere sicuri che nel vostro Gradle file che si ha la seguente riga all'interno le dipendenze:.

com.android.support:appcompat-v7:24.2.1
(questa è la versione più recente Assicurarsi di avere tutti i pacchetti aggiornati, cercando in il responsabile SDK).

Quindi nell'attività in cui si desidera mostrarlo è necessario importare android.support.v7.app.AlertDialog e utilizzare AlertDialog.Builder esattamente come lo si stava usando in precedenza.

+0

Considero questa domanda come risposta, sebbene siano sorti ulteriori problemi. Usando la classe di supporto per AlertDialog, la personalizzazione viene limitata perché gli attributi di colore come topDark non hanno più effetto, inseriti all'interno di alertDialogTheme o alertDialogStyle. Inoltre, la stessa soluzione non può essere applicata a DatePickerDialog e TimePickerDialog, purché queste classi non abbiano finora la loro versione di supporto. – Milack27

+0

In questi casi è necessario continuare a utilizzare i selettori di data e ora predefiniti inclusi in ciascuna API o utilizzare alcuni [porta non ufficiale di ritrasferimento] (https://github.com/SimonVT/android-numberpicker). –

+0

La porta non ufficiale può funzionare, non li ho mai provati. Ma quelli di default avranno lo stesso problema. – Milack27

2

ho riparato utilizzando il codice qui sotto:

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

Questo è ciò che zgc7009 ha suggerito nel primo commento. Funziona, se definisco due stili XML, uno per ogni API. In caso contrario, i dialoghi appariranno strani su Android Lollipop. Penso che la soluzione di Joaquin sia molto più semplice, però. – Milack27