web-dev-qa-db-fra.com

L'habillage de boîte de dialogue avec AppCompat-v7 22 entraîne des ombres moches sur api <21

J'utilise AppCompat pour écrire une application de style design matériel. Étant donné qu'AppCompat n'affecte pas les boîtes de dialogue, j'habille les boîtes de dialogue en tant que telles:

styles.xml:

<style name="AppTheme.Base" parent="Theme.AppCompat">
    <!-- Set AppCompat’s color theming attrs -->
    <item name="colorPrimary">@color/green</item>
    <item name="colorPrimaryDark">@color/green_darker</item>
    <item name="colorAccent">@color/accent</item>

    <item name="Android:alertDialogTheme">@style/alertDialog</item>
    <item name="Android:dialogTheme">@style/alertDialog</item>
</style>

<style name="alertDialog" parent="Theme.AppCompat.Dialog">
    <item name="colorPrimary">@color/green</item>
    <item name="colorPrimaryDark">@color/green_darker</item>
    <item name="colorAccent">@color/accent</item>
</style>

Je suis exactement ce que je voulais sur Android api> = 21, mais sur d'autres appareils, je me retrouve avec une "boîte" autour des dialogues.

Existe-t-il un moyen de se débarrasser de la "boîte" autour de la boîte de dialogue et même d'obtenir les couleurs et le thème du matériau appliqués sur api <21, de préférence sans dépendances supplémentaires?

Application sur Api <21:

App on API < 21

Application sur API> = 21:

App on API >= 21

25
snowdragon

Avec le nouveau AppCompat v22.1 vous pouvez utiliser le nouveau Android.support.v7.app.AlertDialog ou le nouveau AppCompatDialog

Utilisez simplement un code comme celui-ci (bien sûr, dans votre cas, vous devez utiliser une mise en page personnalisée pour avoir la barre de progression)

import Android.support.v7.app.AlertDialog

AlertDialog.Builder builder =
       new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle);
            builder.setTitle("Dialog");
            builder.setMessage("Lorem ipsum dolor ....");
            builder.setPositiveButton("OK", null);
            builder.setNegativeButton("Cancel", null);
            builder.show();

Et utilisez un style comme celui-ci:

<style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
        <item name="colorAccent">#FFCC00</item>
        <item name="Android:textColorPrimary">#FFFFFF</item>
        <item name="Android:background">#5fa3d0</item>
    </style>
33
Gabriele Mariotti

Si quelqu'un cherche toujours une solution simple et efficace, ajoutez simplement cette ligne à votre style "alertDialog":

<item name="Android:windowBackground">@Android:color/transparent</item>

P.S. la modification de cette propriété affecte également les boîtes de dialogue de PreferenceFragment sur API> = 21, assurez-vous donc que vous utilisez des styles différents: avec bg transparent pour API <21, et sans aucune modification pour API> = 21

10
Alex Timonin

ProgressDialog - Essayez ci-dessous Android 5

dialog.getWindow().setBackgroundDrawableResource(Android.R.color.transparent);

ou

dialog.getWindow().clearFlags(LayoutParams.FLAG_DIM_BEHIND);
6
Rahul

J'ai eu exactement le même problème avec la nouvelle bibliothèque AppCompat 22 lors de l'utilisation d'Android.support.v7.app.AlertDialog pour tous mes AlertDialogs, mais les couches d'arrière-plan supplémentaires n'ont affecté que ProgressDialogs.

Tous mes AlertDialogs lorsqu'ils étaient stylisés en utilisant mon thème personnalisé avaient l'air super, mais les ProgressDialog avaient une superposition étrange sur l'arrière-plan, comme décrit dans l'OP.

Une option que j'avais était de définir un style spécifique à chaque fois que je construisais une barre de progression, mais je cherchais une solution à l'échelle de l'application.

À l'aide de ces deux liens:

Comment styliser AlertDialogs comme un pro et Joerg Richter Blog J'ai pu me débarrasser de la couche supplémentaire dessinée sur <21 ProgressDialogs.

Le problème que j'ai trouvé est que sur toutes les versions, la ProgressBar tire son arrière-plan en fonction de ce qui est défini par défaut dans "Android: alertDialogStyle".

Donc, pour me débarrasser de la couche supplémentaire, j'ai dû définir mes propres styles et les définir pour "Android: alertDialogStyle". Ce faisant, je remplace également les dispositions par défaut appliquées aux ProgressDialogs.

Voici mon themes.xml:

<item name="Android:alertDialogTheme">@style/MyAlertDialogTheme</item>
<item name="alertDialogTheme">@style/MyAlertDialogTheme</item>
<item name="Android:alertDialogStyle">@style/MyAlertDialogStyles</item>

Et mon styles.xml:

<style name="MyAlertDialogTheme">
    <item name="Android:windowIsFloating">true</item>
    <item name="Android:windowBackground">@Android:color/transparent</item>
    <item name="Android:windowContentOverlay">@null</item>
    <item name="Android:windowAnimationStyle">@Android:style/Animation.Dialog</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="Android:background">@color/theme_alert_dialog_background</item>
    <item name="colorAccent">@color/theme_accent_1</item>
</style>

<style name="AlertDialog">
    <item name="Android:fullDark">@Android:color/transparent</item>
    <item name="Android:topDark">@Android:color/transparent</item>
    <item name="Android:centerDark">@Android:color/transparent</item>
    <item name="Android:bottomDark">@Android:color/transparent</item>
    <item name="Android:fullBright">@Android:color/transparent</item>
    <item name="Android:topBright">@Android:color/transparent</item>
    <item name="Android:centerBright">@Android:color/transparent</item>
    <item name="Android:bottomBright">@Android:color/transparent</item>
    <item name="Android:bottomMedium">@Android:color/transparent</item>
    <item name="Android:centerMedium">@Android:color/transparent</item>
</style>
6
activelogic

Vous pouvez télécharger la révision 22.1.0 (mise à jour il y a quelques jours) et utiliser Android.support.v7.app.AlertDialog

2
hoonj