Mobile

15 abr, 2019

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

Publicidade

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 iOS 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:

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!