Dev (Back & Front)ARTIGO

Xamarin Rocket – Parte 03: tela cheia, ocultando a barra de status

Dando continuidade à sua série de dicas de Xamarin, neste artigo Thiago Bertuzzi mostra como ocultar a barra de status e tornar uma aplicação tela cheia.

Xamarin Rocket – Parte 03: tela cheia, ocultando a barra de status
Imagem: Thiago Bertuzzi

Fala, galera!

Tentando manter a periodicidade semanal, chegamos novamente com uma dica rápida de Xamarin.Forms!

A ideia é ser um artigo bem rápido, e todas as dicas ficarão em um único repositório. Se você perdeu algum, confira os artigos que já saíram:

Muitas vezes, para melhorar a interface do nosso aplicativo, podemos fazê-lo em tela cheia. Ou seja, ocultar a barra de status!

Existe uma forma muito fácil de se fazer isso, com Xamarin.Forms. Mais fácil com iOSiOS38 conteúdosO X do Xamarin Forms – O guia das funcionalidades nativas – Parte 01: iOSDev (Back & Front) · abr 2019Desenvolvedores: Apple libera terceiro beta do iOS 12.4Dev (Back & Front) · mai 201910 bibliotecas que todo desenvolvedor iOS deve substituir ainda em 2024Dev (Back & Front) · out 2024Ver tudo em Dev (Back & Front) do que com Android, mas fácil também.

Antes que você fique confuso, vamos a ela!

iOS

De uma forma bem simples, apenas precisamos adicionar o namespace das propriedades de plataforma do iOS xmlns:iOS=”clr-namespace: Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core” e  em seguida habilitar PrefersStatusBarHidden:

html
xmlns:iOS="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
iOS:Page.PrefersStatusBarHidden="True"

Se quiser aprender mais sobre funcionalidades nativas, clique aqui.

Rodando:

Adeus status bar

Android

No Android precisamos criar uma funcionalidade nativa – nada muito difícil:

Primeiro criaremos a interface no projeto compartilhado:

using System;
namespace XamarinRocket.Helpers
{
    public interface IAndroidHideStatusBar
    {
        void HideStatusBar(bool hide);
    }
}

Em seguida criaremos no Android o AndroidHideStatusBar:

using System;
using Xamarin.Forms;
using Plugin.CurrentActivity;
using XamarinRocket.Droid.Helpers;
using XamarinRocket.Helpers;
using Android.Views;
using Android.App;

[assembly: Dependency(typeof(AndroidHideStatusBar))]
namespace XamarinRocket.Droid.Helpers
{
    public class AndroidHideStatusBar : IAndroidHideStatusBar
    {
        WindowManagerFlags _originalFlags;

        public void HideStatusBar(bool hide)
        {
            var activity = (Activity)Forms.Context;
            var attrs = activity.Window.Attributes;

            if (hide)
            {
                _originalFlags = attrs.Flags;
                attrs.Flags |= Android.Views.WindowManagerFlags.Fullscreen;
                activity.Window.Attributes = attrs;
            }
            else
            {
                attrs.Flags = _originalFlags;
                activity.Window.Attributes = attrs;
            }
        }

    }
}

Agora chamaremos o Dependency service na tela principal:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using XamarinRocket.Helpers;
using XamarinRocket.ViewModel;

namespace XamarinRocket
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();

            this.BindingContext = new MainViewModel();

            if (Xamarin.Forms.Device.RuntimePlatform == Xamarin.Forms.Device.Android)
            {
                Xamarin.Forms.DependencyService.Get<IAndroidHideStatusBar>().HideStatusBar(true);
            }
        }
    }
}

Rodando:

Legal, não?

  • Mas Bertuzzi, o Forms.Context está obsoleto. Posso ficar usando?

Certo, então vamos implementar o nosso com o novo Application.Context:

Criaremos nosso próprio MainApplication:

using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;

namespace XamarinRocket.Droid.Helpers
{
    [Application]
    public partial class MainApplication : Application, Application.IActivityLifecycleCallbacks
    {
        internal static Context ActivityContext { get; private set; }

        public MainApplication(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer) { }

        public override void OnCreate()
        {
            base.OnCreate();
            RegisterActivityLifecycleCallbacks(this);
        }

        public override void OnTerminate()
        {
            base.OnTerminate();
            UnregisterActivityLifecycleCallbacks(this);
        }

        public void OnActivityCreated(Activity activity, Bundle savedInstanceState)
        {
            ActivityContext = activity;
        }

        public void OnActivityResumed(Activity activity)
        {
            ActivityContext = activity;
        }

        public void OnActivityStarted(Activity activity)
        {
            ActivityContext = activity;
        }

        public void OnActivityDestroyed(Activity activity) { }
        public void OnActivityPaused(Activity activity) { }
        public void OnActivitySaveInstanceState(Activity activity, Bundle outState) { }
        public void OnActivityStopped(Activity activity) { }
    }
}

E colocaremos no Lugar do FormContext:

using System;
using Xamarin.Forms;
using Plugin.CurrentActivity;
using XamarinRocket.Droid.Helpers;
using XamarinRocket.Helpers;
using Android.Views;
using Android.App;

[assembly: Dependency(typeof(AndroidHideStatusBar))]
namespace XamarinRocket.Droid.Helpers
{
    public class AndroidHideStatusBar : IAndroidHideStatusBar
    {
        WindowManagerFlags _originalFlags;

        public void HideStatusBar(bool hide)
        {
            var activity = (Activity)MainApplication.ActivityContext; ;
            var attrs = activity.Window.Attributes;

            if (hide)
            {
                _originalFlags = attrs.Flags;
                attrs.Flags |= Android.Views.WindowManagerFlags.Fullscreen;
                activity.Window.Attributes = attrs;
            }
            else
            {
                attrs.Flags = _originalFlags;
                activity.Window.Attributes = attrs;
            }
        }

    }
}

Duas dicas pelo preço de uma, hein?

É uma dica bem simples, mas que ajuda muito.

Caso queiram baixar o código utilizado no exemplo, cliquem aqui.

Quer ver outros artigos sobre Xamarin? Acesse este link.

Espero ter ajudado.

Aquele abraço!

Desenvolvedor .Net há 12 anos e vem participando de projetos Desktop, Services, Web e Mobile utilizando Xamarin. Microsoft MVP em Developer Technologies e Líder Técnico na NESS. Contribui para comunidade Xamarin escrevendo artigos, compartilhando códigos e criando pacotes Nuget.

Ver perfil