2010-06-25 10 views
19

Uso la classe AlertDialog nella mia applicazione. Per impostazione predefinita, queste finestre di avviso hanno uno sfondo trasparente. Sto cercando invece di usare uno sfondo opaco, senza successo. Questi sono i miei stili:Come posso modificare lo sfondo delle finestre di avviso di Android?

<style name="MyOpaqueActivity" parent="@android:style/Theme.Dialog"> 
    <item name="android:windowBackground">@drawable/my_background</item> 
    <item name="android:alertDialogStyle">@style/MyOpaqueAlertDialog</item> 
</style> 

<style name="MyOpaqueAlertDialog" parent="@android:style/Theme.Dialog.Alert"> 
    <item name="android:background">#454545</item> 
    <item name="android:windowBackground">@drawable/my_background</item> 
    <item name="android:popupBackground">@drawable/my_background</item> 
</style> 

ho applicato lo stile "MyOpaqueActivity" con successo per le attività di interi (lo sfondo della finestra viene modificato in "my_background"), ma non funziona per le finestre di dialogo di avviso all'interno di tali attività. L'attributo "alertDialogStyle" e il mio stile "MyOpaqueAlertDialog" non sembrano avere alcun effetto.

Quindi, come posso modificare lo sfondo di queste finestre di avviso?

risposta

11

Il tuo approccio non funzionerà. Sembra AlertDialog (e Builder) hardcode il tema e non onorano alertDialogStyle ovunque:

protected AlertDialog(Context context) { 
    this(context, com.android.internal.R.style.Theme_Dialog_Alert); 
} 

public Builder(Context context) { 
    this(context, com.android.internal.R.style.Theme_Dialog_Alert); 
} 

Sono arrivati ​​alla stessa conclusione here.

Una classe di dialogo personalizzata derivata da AlertDialog che richiama il costruttore protetto AlertDialog (context, R.style.MyOpaqueAlertDialog) sarebbe una soluzione alternativa.

Nell'ultima sorgente Android, c'è un nuovo costruttore pubblico per AlertDialog.Builder che accetta un argomento a tema. Sfortunatamente, non è ancora stato rilasciato (forse in Gingerbread?).

+1

puoi elaborare un po 'la tua risposta, perché è imprecisa. Innanzitutto, non è vero che la domanda a cui fai riferimento discute il problema della finestra di dialogo di avviso ** sfondi **; laggiù, si tratta di pulsanti. In secondo luogo, il fatto che il nome di un tema sia hardcoded non significa che il tema non possa essere personalizzato. –

3

Dal documentation sembra come se fosse possibile farlo in onCreateDialog.

FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom); 
fl.setBackgroundResource(); // has to be a drawable. 

Solo altra soluzione è una finestra di dialogo personalizzata che utilizza quel tema.

4

È facile farlo in uno stile XML una volta capito che AlertDialogs ha attributi un po 'speciali.

Tuttavia, sarebbe interessante sapere a quale versione di Android ci si riferisce (o si sta puntando). Theme.Dialog è relativamente nuovo per quanto ne so. Le versioni Android più recenti non utilizzano AlertDialogs in tutte le circostanze in cui le versioni precedenti li utilizzavano.

Questo funziona per me in Android 2.2:

<style name="MyTheme" parent="@android:style/Theme"> 
    <item name="android:alertDialogStyle">@style/MyOpaqueAlertDialog</item> 
</style> 

<style name="MyOpaqueAlertDialog"> 
    <item name="android:fullDark">@drawable/[...]</item> 
    <item name="android:topDark">@drawable/[...]</item> 
    <item name="android:centerDark">@drawable/[...]</item> 
    <item name="android:bottomDark">@drawable/[...]</item> 
    <item name="android:fullBright">@drawable/[...]</item> 
    <item name="android:topBright">@drawable/[...]</item> 
    <item name="android:centerBright">@drawable/[...]</item> 
    <item name="android:bottomBright">@drawable/[...]</item> 
    <item name="android:bottomMedium">@drawable/[...]</item> 
    <item name="android:centerMedium">@drawable/[...]</item> 
</style> 

recenti versioni di Android hanno anche Android: progressLayout e Android: attributi horizontalProgressLayout per lo stile AlertDialog.

Inoltre, nelle versioni Android più recenti, è possibile fare riferimento a un tema AlertDialog utilizzando alertDialogTheme anziché alertDialogStyle in un tema personalizzato. AlertDDialogThemes supporta attributi più familiari e più potenti come windowBackground, windowTitleStyle ecc. Dai uno sguardo a styles.xml e themes.xml.

Sfortunatamente, la documentazione di quale funzionalità è stata aggiunta quando è super scarsa. Si prega di scoprire da soli che l'approccio è il migliore per voi.

Problemi correlati