UPDATE: ho fatto una libreria per combattere il problema (usa AppCompat r22): https://github.com/consp1racy/android-support-preference
Il ListPreference
estende DialogPreference
che utilizza questo pezzo di codice per creare la finestra di dialogo:
mBuilder = new AlertDialog.Builder(context)
.setTitle(mDialogTitle)
.setIcon(mDialogIcon)
.setPositiveButton(mPositiveButtonText, this)
.setNegativeButton(mNegativeButtonText, this);
Come si può vedere il costruttore AlertDialog.Builder
non viene fornito con il secondo parametro opzionale int theme
. Ciò significa che la finestra di dialogo sarà a tema indipendentemente dal tema della tua attività nell'attributo android:alertDialogTheme
.
Ora è necessario creare un tema personalizzato per la tua finestra di dialogo che deriva da Theme.AppCompat.Dialog
in questo modo:
<style name="Theme.YourApp.Dialog.Alert" parent="Theme.AppCompat.Light.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</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="colorAccent">@color/accent_yourapp</item>
<item name="colorPrimary">@color/primary_yourapp</item>
<item name="colorPrimaryDark">@color/primary_dark_yourapp</item>
</style>
Problema 1: La soluzione di cui sopra non funzionerà per RingtonePreference
perché non si estende ListPreference
ma le chiamate un intento di scelta della suoneria, quindi è sempre a tema secondo il sistema. Dai un'occhiata a questa risposta: RingtonePreference Theme Quindi possiamo contrassegnare questo come risolto.
Problema 2: Le finestre di dialogo AppCompat mancano di titolo. E finora non ho trovato un modo per risolvere questo problema. Vero che non sto guardando abbastanza bene. Ignoriamo l'assenza del titolo come un problema minore.
Problema 3: Il pulsante drawable radiofonici non sono mutati in modo la grafica non sono coerenti tra stato passivo e attivo (colorato) - tutti sono colorati (non solo quello che si ri premendo!) O tutti sono grigi.Ora, questo è davvero fastidioso
problemi 2 & 3 mi ha costretto a prendere un'altra strada - la mia finestra tema appare così su API 14+
<style name="Theme.MyApp.Dialog.Alert" parent="android:Theme.DeviceDefault.Light.Dialog.MinWidth">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
</style>
e come questo su API 21+
<style name="Theme.YourApp.Dialog.Alert" parent="android:Theme.DeviceDefault.Light.Dialog.MinWidth">
<item name="android:colorPrimary">@color/primary_yourapp</item>
<item name="android:colorPrimaryDark">@color/primary_dark_yourapp</item>
<item name="android:colorAccent">@color/accent_yourapp</item>
</style>
Questi valori sono stati acquisiti sperimentalmente eseguendo la scansione attraverso i file sorgente della piattaforma e ben testato.
Il punto è che l'unica soluzione affidabile sembra utilizzare il tema di dialogo predefinito del dispositivo. L'unica scelta prima di Lollipop è una variante chiara o scura. Su Lollipop questo funzionerà come previsto e richiesto.
EDIT: Dal appcompat-v7-r21.1.0 è possibile utilizzare AppCompatDialog
che è materiale la variante a tema di natale AlertDialog
.
È possibile utilizzare fornito AlertDialog.Builder
(da non confondere con la controparte nativa) per la creazione delle sue istanze.
Grazie. Questo è quello di cui avevo bisogno. – Willis
Su AppCompat v22.1 è possibile utilizzare android.support.v7.app.AlertDialog –
Sì, desidero che lo avessi 6 mesi fa: D –