2

我使用Xamarin.Forms和我有得到两件事情在Android上工作了一个问题:Xamarin.Forms中心的标题和透明的导航栏 - Android电子

  1. 我想设置动作条是透明的,设置BarBackgroundColor适用于任何颜色但不透明。
  2. 我希望页面标题居中,就像在iOS上一样。

    MainPage = new NavigationPage(
         new LoginPage(){Title = "Center"}) {BarBackgroundColor = Color.Transparent}); 
    

谁能帮助我?

回答

2

您需要创建一个自定义渲染器来实现这一点。

[assembly: ExportRenderer (typeof(NavigationPage), typeof(NavigationPageRenderer))] 
namespace Droid 
{ 

public class NavigationPageRenderer : NavigationRenderer 
{ 

    protected override void OnElementChanged (ElementChangedEventArgs<NavigationPage> e) 
    { 
     base.OnElementChanged (e); 

     ApplyTransparency(); 
    } 

    protected override bool DrawChild (Android.Graphics.Canvas canvas, Android.Views.View child, long drawingTime) 
    { 
     ApplyTransparency(); 
     return base.DrawChild (canvas, child, drawingTime); 
    } 

    void ApplyTransparency() 
    { 
     var activity = ((Activity)Context); 
     var actionBar = activity.ActionBar; 
     actionBar.SetIcon (Resource.Drawable.actionbaricon); 
     actionBar.SetBackgroundDrawable (null); 
    } 
} 
} 

对我来说,只有同时使用OnElementChanged和DrawChild调用RemoveAppIconFromActionBar否则的工作,当你浏览到其他网页它使加入吧分频器。

您还需要将Window.RequestFeature (WindowFeatures.ActionBarOverlay);添加到MainActivity类。

如果有人发现一个更好的方式来做到这一点,而不是使用DrawChild()请让我知道。

希望它可以帮助

3

我最近遇到同样的问题,我是用在Xamarin.FormsMasterDetailPage和Android的它不设置标题中心。

因此,明显的路线是创建一个自定义渲染器和overrideOnLayout方法,并找到工具栏的TextView并设置其GravityCenter,容易吗?

但是,嘿,当我试图做到这一点myTextView.Gravity = Android.Views.GravityFlags.Center它只是不起作用。我试过设置ForegroundGravity但没有效果。

因此,最后我计算了中心X位置并设置了TextView X位置和VOILLA!它现在在中心。这是我的解决方案。

[assembly: ExportRenderer(typeof(CustomMasterDetailPage), typeof(CustomMasterDetailPageRenderer))] 
namespace myApp.Droid 
{ 
    public class CustomMasterDetailPageRenderer : MasterDetailPageRenderer 
    { 
     protected override void OnLayout(bool changed, int l, int t, int r, int b) 
     { 
      base.OnLayout(changed, l, t, r, b); 

      var toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar); 

      for (int index = 0; index < toolbar.ChildCount; index++) 
      { 
       if (toolbar.GetChildAt(index) is TextView) 
       { 
        var title = toolbar.GetChildAt(index) as TextView; 
        float toolbarCenter = toolbar.MeasuredWidth/2; 
        float titleCenter = title.MeasuredWidth/2; 
        title.SetX(toolbarCenter - titleCenter); 
       } 
      } 
     } 
    } 
}