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