Xamarin: изменить StatusBarColor во время навигации - PullRequest
0 голосов
/ 27 ноября 2018

В MainActivity OnCreate я устанавливаю цвет StatusBar с помощью:

Window.SetStatusBarColor(Resources.GetColor(Resource.Color.colorPrimary));

Для конкретных страниц мне нужно установить прозрачный цвет StatusBar.

Возможно сделатьчто в пользовательском классе визуализации Android?

РЕДАКТИРОВАТЬ: мой метод OnLayout на пользовательском ANdorid

 protected override void OnLayout(bool changed, int l, int t, int r, int b)
        {

            CustomNavigation.IgnoreLayoutChange = true;
            base.OnLayout(changed, l, t, r, b);
            CustomNavigation.IgnoreLayoutChange = false;

            int containerHeight = b - t;

            PageController.ContainerArea = new Rectangle(0, 0, Context.FromPixels(r - l), Context.FromPixels(containerHeight));


            if (Element?.Navigation?.NavigationStack.Count == 1)
            {
                CustomNavigation.BarBackgroundColor = Color.Transparent;
                //HERE I NEED TO HAVE STATUS AR TRANSPARENT 
            }


            if (Element?.Navigation?.NavigationStack.Count > 1)
            {
                PageController.ContainerArea = new Rectangle(0, 60, Context.FromPixels(r - l), Context.FromPixels(containerHeight));
                CustomNavigation.BarBackgroundColor = Color.FromHex("#006CA6");
            }


            for (var i = 0; i < ChildCount; i++)
            {
                AView child = GetChildAt(i);

                if (child is Android.Support.V7.Widget.Toolbar)
                {

                   continue;
                }

                child.Layout(0, 0, r, b);
            }
        }

1 Ответ

0 голосов
/ 27 ноября 2018

Внешний вид строки состояния - это фон и цвета текста.Оба свойства имеют свои ограничения на разных платформах, однако мы можем манипулировать обоими с помощью решения, описанного ниже.

Наша цель проста, мы хотим иметь возможность переключать внешний вид строки состояния между LightTheme и DarkTheme во время выполнения:

  • Определите интерфейс в вашем общем коде:

     public interface IStatusBarStyleManager
     {
          void SetLightTheme();
          void SetDarkTheme();
     }
    

Начиная с Android Lollipop (21) можно устанавливать пользовательский статусцвет фона панели, просто определив его в style.xml с помощью клавиши colorPrimaryDark или программно, так как в Android M (23) можно установить предопределенную цветную тему текста строки состояния на светлый или темный.

Код Android:

   public class StatusBarStyleManager : IStatusBarStyleManager
{
public void SetDarkTheme()
{
    if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            var currentWindow = GetCurrentWindow();
            currentWindow.DecorView.SystemUiVisibility = 0;
            currentWindow.SetStatusBarColor(Android.Graphics.Color.DarkCyan);
        });
    }
}

public void SetLightTheme()
{
    if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            var currentWindow = GetCurrentWindow();
            currentWindow.DecorView.SystemUiVisibility = (StatusBarVisibility)SystemUiFlags.LightStatusBar;
            currentWindow.SetStatusBarColor(Android.Graphics.Color.LightGreen);
        });
    }
}

Window GetCurrentWindow()
{
    var window = CrossCurrentActivity.Current.Activity.Window;

    // clear FLAG_TRANSLUCENT_STATUS flag:
    window.ClearFlags(WindowManagerFlags.TranslucentStatus);

    // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
    window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);

    return window;
}
}

Я использую плагин Current Activity от James Montemagno, чтобы получить ссылку на текущую активность.

Код iOS:

В iOS цвет фона строки состояния по умолчанию соответствует цвету панели навигации.Другими словами, нам не нужно явно устанавливать цвет фона строки состояния, если мы хотим, чтобы он совпадал с цветом фона панели навигации.Начиная с iOS 7 можно установить предопределенную цветную тему текста в строке состояния на светлый или темный.Однако нам придется манипулировать Info.plist.Так как поведение строки состояния по умолчанию определяется контроллерами представления, мы должны отключить это:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

Далее мы можем определить цветовую тему текста по умолчанию:

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleDefault</string>


public class StatusBarStyleManager : IStatusBarStyleManager
{
    public void SetDarkTheme()
   {
        Device.BeginInvokeOnMainThread(() =>
       {
        UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.LightContent, false);
        GetCurrentViewController().SetNeedsStatusBarAppearanceUpdate();
    });
}

public void SetLightTheme()
{
    Device.BeginInvokeOnMainThread(() =>
    {
        UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.Default, false);
        GetCurrentViewController().SetNeedsStatusBarAppearanceUpdate();
    });
}

    UIViewController GetCurrentViewController()
   {
      var window = UIApplication.SharedApplication.KeyWindow;
      var vc = window.RootViewController;
      while (vc.PresentedViewController != null)
          vc = vc.PresentedViewController;
      return vc;
   }
 }

Goodluck

Возврат в случае запросов.

...