【问题标题】:Xamarin: change StatusBarColor during navigationXamarin:在导航期间更改 StatusBarColor
【发布时间】:2018-11-27 23:43:00
【问题描述】:

在 MainActivity OnCreate 中,我使用以下方法设置了 StatusBar 的颜色:

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

对于具体的页面,我需要设置StatusBar颜色透明。

可以在 Android 自定义呈现的类中做到这一点吗?

编辑: 我在自定义 ANDorid 上的 OnLayout 方法

 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);
            }
        }

【问题讨论】:

  • 我已经在你之前的问题的回答中评论过,这不起作用。
  • 是的,但现在我问的是状态栏
  • 哦,对不起!最好说最顶部的状态栏最底部的状态栏,因为这几件事很令人困惑。
  • 你想要这个用于 Xamarin Android 原生还是 Xamarin Forms?
  • 我有一个适用于 Android 的自定义 PageRenderer。但是,如果您有 xamarin forms 解决方案,我敢打赌我可以使用它。

标签: xamarin statusbar custom-renderer


【解决方案1】:

状态栏外观与其背景和文本颜色有关。这两个属性在不同的平台上都有自己的限制,但是,我们可以使用下面描述的解决方案来处理这两个属性。

我们的目标很简单,我们希望能够在运行时在 LightTheme 和 DarkTheme 之间切换状态栏外观:

  • 在你的共享代码中定义一个接口:

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

从 Android Lollipop (21) 开始,可以通过简单地在 style.xml 中使用键 colorPrimaryDark 或以编程方式定义自定义状态栏背景颜色来设置自定义状态栏背景颜色,从 Android M (23) 开始,可以设置预定义状态栏文本颜色主题为浅色或深色。

安卓代码:

   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;
}
}

我正在使用 James Montemagno 的 Current Activity Plugin 来获取当前活动的参考。

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;
   }
 }

祝你好运

在查询时还原。

【讨论】:

  • 你的解决方案是否允许透明状态栏?
  • 如果你正确编辑它并给它写颜色为什么不,你将不得不更改一些代码以满足你的需要
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2019-04-03
  • 2021-06-19
相关资源
最近更新 更多