Loupe

Android - personnaliser l'apparence des dialogues avec Xamarin Forms

Xamarin Forms nous permet d'afficher des messages ou de proposer des choix à valeurs multiples très facilement depuis la partie commune. Dans cet article, nous verrons comment personnaliser l'affichage de ces interfaces sous Android et notamment comment appliquer un thème sombre.

Pour afficher ces dialogues, il suffit de passer par les méthodes DisplayActionSheet ou DisplayAlert, bien documentées sur le site de Microsoft et dont le fonctionnement est très simple. 

string result = await this.DisplayActionSheet ("Tri à appliquer",
    "Ne rien faire",
    null,
    new [] {
        "Du plus ancien au plus récent",
        "Du plus récent au plus ancien",
        "Par ordre alphabétique croissant",
        "Par ordre alphabétique décroissant",
    }
);

switch (result) {
    case "Du plus ancien au plus récent":
        // faire quelquechose
        break;
    case "Du plus récent au plus ancien":
        // faire quelquechose
        break;
    case "Par ordre alphabétique croissant":
        // faire quelquechose
        break;
    case "Par ordre alphabétique décroissant":
        // faire quelquechose
        break;

    default:
}

Dans cet exemple, on donne une liste de chaînes de caractères à afficher et on attend la réponse de l'utilisateur de façon asynchrone.

Screenshot_1581597668.png

Le problème ici c'est que l'on peut très facilement choisir la façon dont s'affiche notre page via le XAML mais que par défaut nous n'avons pas de moyen de contrôle sur l'affichage de ces popups. Si vous avez un thème sombre, elles continueront de s'afficher en blanc et peuvent gêner l'utilisateur.

Pour résoudre ce problème, il faudra passer par de la configuration d'Android en utilisant un style spécifique (nous en avions déjà parlé dans un autre article).

Pour ma part, je définis un style par défaut avec toutes mes propriétés communes que j'appelle ThemeCompat.Splash_Base . Je crée alors deux thèmes dérivant de cette base, un clair que je nommeThemeCompat.Splash  et un sombre, ThemeCompat.Splash_Dark. Dans ce thème sombre, il va falloir surchager deux propriétés alertDialogTheme et android:alertDialogTheme qui prendront comme valeurs un style dérivant de Theme.AppCompat.Dialog.Alert. Nous pouvons alors choisir les couleurs spécifiques aux Dialog Android utilisées par ce thème pour mettre les couleurs correspondant au thème sombre

<style name="ThemeCompat.Splash_Base" 
   parent="Theme.AppCompat.Light.NoActionBar">
...

</style>

 <style
    name="ThemeCompat.Splash"
    parent="ThemeCompat.Splash_Base">  
</style>

<style
    name="ThemeCompat.Splash_Dark"
    parent="ThemeCompat.Splash_Base">
    <item name="android:alertDialogTheme">@style/DialogUplatform</item>
    <item name="alertDialogTheme">@style/DialogUplatform</item>
    <item name="colorControlHighlight">#BBBBBB</item>
</style>

<style
    name="DialogUplatform"
    parent="Theme.AppCompat.Dialog.Alert">
    <item
        name="colorAccent">#A53CFF</item>
    <!-- Used for the title and text -->
    <item
        name="android:textColorPrimary">#FFFFFF</item>
       <item
        name="android:textColorSecondary">#FFFFFF</item>
    <!-- Used for the background -->
    <item
        name="android:background">#333333</item>
</style>

Il ne reste alors plus qu'à l'appliquer dans notre Activité. Par ailleurs je peux le faire dynamiquement si nécessaire en utilisant une classe ThemeHelper spécifique de mon application. 

if (ThemeHelper.SelectedTheme == AvailableTheme.Dark) {
    SetTheme (Resource.Style.ThemeCompat_Splash_Dark);
}

ThemeHelper.ThemeChanged += (_, __) => {
    if (ThemeHelper.SelectedTheme == AvailableTheme.Dark) {
        SetTheme (Resource.Style.ThemeCompat_Splash_Dark);
    } else {
        SetTheme (Resource.Style.ThemeCompat_Splash);
    }
};

 

Screenshot_1581598438.png

 

Happy coding !

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus