web-dev-qa-db-ja.com

Xamarin.Formsセンタータイトルと透明なナビゲーションバー-Android

Xamarin.Formsを使用していますが、Androidで2つの機能を動作させるのに問題があります。

  1. ActionBarを透明に設定したいのですが、BarBackgroundColorの設定はすべての色で機能しますが、透明では機能しません。
  2. IOSの場合と同じように、ページタイトルを中央に配置したいと思います。

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

誰かがこれで私を助けることができますか?

7
Bonobo

最近同じ問題が発生しました。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);
                }
            }
        }
    }
}
9
Fahadsk

これを実現するには、カスタムレンダラーを作成する必要があります。

_[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を呼び出すだけで機能しました。それ以外の場合は、他のページに移動すると、バーの仕切りが追加され続けます。

また、MainActivityクラスにWindow.RequestFeature (WindowFeatures.ActionBarOverlay);を追加する必要があります。

DrawChild()を使用する代わりに、誰かがこれを行うためのより良い方法を見つけた場合は、私に知らせてください。

それが役に立てば幸い

2
VeYroN