• laurent@lioncoding.com

Interagir avec la barre de statut du smartphone dans Xamarin.Forms


Dans cet article , nous verrons comment cacher puis rendre visible la barre de statut du smartphone dans Xamarin.Forms.

La barre de statut d’un smartphone est la partie de l’écran où s’affiche l’heure, les icônes montrant les réseaux, la connectivité Wifi, le pourcentage de la charge restante de la batterie et aussi les icônes de notification, … etc.

Lorsque vous consultez le statut WhatsApp d’un contact ou que vous jouez de la vidéo en mode plein écran sur votre téléphone, l’on constate la disparition de sa barre de statut.

Comment cela est-il faisable ? C’est l’objet de cet article.

Création du projet Cross-platform Xamarin

Ajout de la librairie suivante au projet Android

Cette libraire nous permettra d’accéder à l’Activité courante du téléphone de sorte qu’on puisse interagir avec la barre de statut. Je souligne que ce plugin nécessite une initialisation dans la méthode OnCreate() de la classe MainActivity.

Structure du projet

Initialisation dans le fichier MainActivity.cs

protected override void OnCreate(Bundle savedInstanceState)
{
    /// ...
    CrossCurrentActivity.Current.Init(this, savedInstanceState);
    /// ...
}

A vos claviers

Le principe ici est de créer une interface fournissant deux méthodes, l’une pour cacher la barre de statut et l’autre pour la ré-afficher. L’interface sera ensuite implémentée par chaque plateforme (Android + iOS) du projet; puis nous utiliserons la notion de DependencyService pour nos actions.

Interface IStatusBar du projet partagé

namespace StatusBar.Interfaces
{
    public interface IStatusBar
    {
        void HideStatusBar();
        void ShowStatusBar();
    }
}

Implémentation côté Android

using Android.App;
using Android.Views;
using Plugin.CurrentActivity;
using StatusBar.Droid.PlatformCode;
using StatusBar.Interfaces;
using Xamarin.Forms;

[assembly: Dependency(typeof(StatusBarImplementation))]
namespace StatusBar.Droid.PlatformCode
{
    public class StatusBarImplementation : IStatusBar
    {
        public StatusBarImplementation()
        {

        }

        WindowManagerFlags _originalFlags;

        public void HideStatusBar()
        {
            // Get current activity
            Activity activity = CrossCurrentActivity.Current.Activity;

            var attrs = activity.Window.Attributes;
            _originalFlags = attrs.Flags;
            attrs.Flags |= WindowManagerFlags.Fullscreen;
            activity.Window.Attributes = attrs;
        }

        public void ShowStatusBar()
        {
            var activity = CrossCurrentActivity.Current.Activity;
            var attrs = activity.Window.Attributes;
            attrs.Flags = _originalFlags;
            activity.Window.Attributes = attrs;
        }
    }
}

Implémentation sur iOS

using StatusBar.Interfaces;
using StatusBar.iOS.PlatformCode;
using UIKit;
using Xamarin.Forms;

[assembly: Dependency(typeof(StatusBarImplementation))]
namespace StatusBar.iOS.PlatformCode
{
    public class StatusBarImplementation : IStatusBar
    {
        public StatusBarImplementation()
        {

        }

        public void HideStatusBar()
        {
            UIApplication.SharedApplication.StatusBarHidden = true;
        }

        public void ShowStatusBar()
        {
            UIApplication.SharedApplication.StatusBarHidden = false;
        }
    }
}

Une simple vue à afficher

Nous disposerons deux boutons sur la vue, le premier aura pour rôle de cacher la barre de statut et la deuxième, de la ré-afficher.

Le code correspondant:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
    x:Class="StatusBar.MainView"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    Title="StatusBar">

    <StackLayout
        HorizontalOptions="Center"
        Orientation="Horizontal"
        VerticalOptions="Center">

        <Button
            x:Name="HideStatusBarButton"
            Clicked="HideStatusBarButton_Clicked"
            Text="Hide" />
        <Button
            x:Name="ShowStatusBarButton"
            Clicked="ShowStatusBarButton_Clicked"
            Text="Show" />

    </StackLayout>

</ContentPage>

Le code behind de la vue

using StatusBar.Interfaces;
using System;
using Xamarin.Forms;

namespace StatusBar
{
    public partial class MainView : ContentPage
    {
        public MainView()
        {
            InitializeComponent();
            ShowStatusBarButton.IsEnabled = false;
        }

        private void HideStatusBarButton_Clicked(object sender, EventArgs e)
        {
            DependencyService.Get<IStatusBar>().HideStatusBar();
            HideStatusBarButton.IsEnabled = false;
            ShowStatusBarButton.IsEnabled = true;
        }

        private void ShowStatusBarButton_Clicked(object sender, EventArgs e)
        {
            DependencyService.Get<IStatusBar>().ShowStatusBar();
            HideStatusBarButton.IsEnabled = true;
            ShowStatusBarButton.IsEnabled = false;
        }
    }
}

Résultat

Ressources

Voici le lien vers le code source de ce projet sur Github.


Commentaires