2010-03-26 15 views
14

Qualcuno sa come sovrascrivere lo stile predefinito per i pulsanti AlertDialog? Ho esaminato la sorgente Android per themes e styles e ho sperimentato diverse cose, ma non sono riuscito a trovare un modo che funzioni.Stile pulsante in AlertDialogs

Quello che ho qui sotto funziona per cambiare lo sfondo, ma non fa nulla con i pulsanti. myTheme viene applicato all'intero <application> tramite il manifest. (Alcuni altri elementi sono stati eliminati per chiarezza, ma riguardano solo la barra del titolo.)

<style name="myTheme" parent="android:Theme"> 
    <item name="android:buttonStyle">@style/customButtonStyle</item> 
    <item name="android:alertDialogStyle">@style/dialogAlertTheme</item> 
</style> 

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert"> 
    <item name="android:fullDark">@drawable/dialog_loading_background</item> 
    <item name="android:topDark">@drawable/dialog_alert_top</item> 
    <item name="android:centerDark">@drawable/dialog_alert_center</item> 
    <item name="android:bottomDark">@drawable/dialog_alert_bottom</item> 
    <!-- this last line makes no difference to the buttons --> 
    <item name="android:buttonStyle">@style/customButtonStyle</item> 
</style> 

Qualche idea?

risposta

2

Immagino che sia necessario implementare la propria classe Dialog.

+4

Hmm. Sarebbe fastidioso; cambiare i pulsanti di dialogo non dovrebbe essere una cosa insolita da fare, considerando che è facile applicare uno stile di pulsante ai pulsanti di attività "normali". –

+0

Nelle normali attività si definisce il layout della vista del contenuto con un xml. La finestra di dialogo lo fa per te, quindi non hai accesso al layout xml. L'implementazione della propria finestra di dialogo (possibilmente con solo una chiamata setContentView()) consente di utilizzare un diverso xml e quindi diversi stili per i pulsanti. – MrSnowflake

+1

Come classificare AlertDialog in modo da poter utilizzare AlertDialog.Builder con la sottoclasse? –

23

Dato che il ragionamento di MrSnowflake è impreciso, mi sto prendendo la libertà di fornire un'altra risposta.

C'è qualcosa di sbagliato con la markup in questione di Steve Haley, e si confonde alertDialogStyle e alertDialogTheme, molto probabilmente a causa del fatto che alertDialogTheme è stato introdotto molto tempo dopo alertDialogStyle era intorno.

Quindi, anche se @android: stile/Theme.Dialog.Alert è disponibile sulla propria piattaforma di Andoid, non è ancora possibile utilizzare il suo potere espressivo agganciando una versione cusomized indietro nel tuo tema a meno che la piattaforma Android supporta una android: alertDialogTheme attributo/elemento per temi. (Può o non può accadere che esistano versioni di questo tipo incoerenti, ma il markup utilizzato nella domanda suggerisce che lo sia.)

Nel markup della domanda, parent = " @android: style/Theme.Dialog.Alert "non farà nulla eccetto creare l'illusione che stai personalizzando il tema della finestra di avviso quando in realtà stai solo personalizzando lo stile della finestra di avviso.

Ecco come dovrebbe apparire il markup; non tutte le versioni di Android supportano tutte le funzionalità.

<style name="myTheme" parent="android:Theme"> 
    <item name="android:buttonStyle">@style/customButtonStyle</item> 
    <item name="android:alertDialogStyle">@style/dialogAlertStyle</item> 
    <item name="android:alertDialogTheme">@style/dialogAlertTheme</item> 
</style> 

<style name="dialogAlertStyle" parent="@android:style/AlertDialog"> 
    <item name="android:fullDark">[...]</item> 
    [...] 
</style> 

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert"> 
    <item name="android:windowBackground">[...]</item> 
    [...] 
</style> 

Personalizzare lo stile di dialogo avviso è stato intorno per un bel po 'di tempo, ma si limita a fornire (background) drawable per "fullDark", "topDark", ecc

Personalizzare il tema di dialogo avviso apre un metodo per fornire attributi come windowBackground, windowTitleStyle e simili, ma come detto prima, è necessaria una versione per Android che supporti l'attributo/elemento alertDialogThem per i temi. Non riesco a capire esattamente quando questo è stato introdotto, ma non è stato Android 2.2 ed Eclipse ti dirà comunque ...

Non ho le risorse per convalidare la conclusione di MrSnowflake che è impossibile stilare una finestra di avviso pulsanti in XML, ma a meno che non ci troviamo di fronte a uno di quegli aspetti un po 'sgradevoli di Android in cui una funzionalità è davvero mancante, la trovo improbabile.

È un dato di fatto, ciò che manca nella questione è la parte più rilevante in questo senso, vale a dire

<style name="customButtonStyle" /> 

così alla conclusione che i pulsanti di dialogo di avviso non obbediscono il Widget.Button non è ancora provata dal mio punto di vista.

Conclusione consolidata: Le funzionalità per definire finestre di avviso di avviso indipendentemente dagli altri widget sono limitate in Android ma diventano più potenti man mano che le nuove versioni migliorano in questo senso.

1

È possibile ignorare "buttonBarButtonStyle" invece di "ButtonStyle" come questo:

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert"> 
    <item name="android:buttonBarButtonStyle">@style/customButtonStyle</item> 
</style> 
+0

richiede l'API 11 o superiore – Yar

+0

come se qualcuno sviluppasse ancora per api 10 e inferiore .. –

+1

@TimCastelijns Ritengo che sia oltre il punto. Una risposta di qualità dovrebbe fornire quell'informazione. E ci sono infatti casi in cui le persone devono mantenere le app compatibili con le versioni precedenti. –

1

ho fatto un metodo come questo che cambierà i colori dei pulsanti di default e lo sfondo

public static void setDefaultColorTextForDialogButton(AlertDialog alertDialog, Resources r) { 
    Button b; 

    b= alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE); 
    if(b != null) { 
     b.setTextColor(r.getColor(R.color.default_text)); 
     b.setBackgroundColor(Color.WHITE); 
    } 
    b = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); 
    if(b != null) { 
     b.setTextColor(r.getColor(R.color.default_text)); 
     b.setBackgroundColor(Color.WHITE); 
    } 
    b = alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL); 
    if(b != null) { 
     b.setTextColor(r.getColor(R.color.default_text)); 
     b.setBackgroundColor(Color.WHITE); 
    } 
} 

Questo potrebbe essere utile per alcune persone !!!

+1

In un linguaggio OO come Java, questo non è davvero il modo preferito di fare le cose, specialmente considerando la manutenibilità. –

4

Prova questa:

<item name="buttonBarStyle">@style/Widget.AppCompat.ButtonBar</item> 
    <item name="buttonBarButtonStyle">@style/AppTheme.Button</item> 
    <item name="buttonBarPositiveButtonStyle">@style/YoursTheme</item> 
    <item name="buttonBarNegativeButtonStyle">@style/YoursTheme</item> 
    <item name="buttonBarNeutralButtonStyle">@style/YoursTheme</item> 
+1

Questo sarebbe più utile se dovessi spiegare dove dovrebbero essere posizionate queste linee. Non riesco a capirlo ... – RenniePet

+0

Grazie per quello, cercavo da ore! @RenniePet dovresti inserirlo nel tuo tema Dialog, un tema che probabilmente dovrebbe estendere 'ThemeOverlay.AppCompat.Dialog.Alert' e che dichiari nel tema usando @ style/YourDialogTheme Benoit

Problemi correlati