提问者:小点点

Android工具栏中心使用Xamarin表单中的效果


我正在尝试以Xamarin形式将Android页面的标题居中。我可以访问工具栏并能够设置字体系列。但我无法将文本对齐或重力设置为中心。

var上下文=(Android. App. Active)Forms. Context;var工具栏=context. Resources. GetIdfier("工具栏","id", context. PackageName);var view=context. FindViewById(工具栏);

我尝试了以下操作:

前景引力

view.SetForegroundGravity(GravityFlags.Center);

文本对齐

view.TextAlignment = Android.Views.TextAlignment.Center;

访问工具栏的Childs并设置方向和对齐方式。

if (view is ViewGroup)
{
    var g = view as ViewGroup;

    for (var i = 0; i < g.ChildCount; i++)
    {
        SetTypefaceToAllTextViews(g.GetChildAt(i), typeface);
        g.GetChildAt(i).TextAlignment = Android.Views.TextAlignment.Center;
        g.GetChildAt(i).TextDirection = TextDirection.Rtl;

    }
}

问题是,我没有直接接触到标题的严重性。

编辑#1:

我在转换视图后添加了这段代码,我可以看到字体在变化,但由于某种原因,它不会居中或对齐

if (view is TextView)
{
    var tv = view as TextView;
    tv.Typeface = typeface;
    tv.TextAlignment = Android.Views.TextAlignment.Center;
    tv.Gravity = GravityFlags.CenterHorizontal;
}

编辑#2:我能够根据下面的答案添加以下效果,它以某种方式居中元素,但不完全在中心。不知何故,它在中心的右侧,除非工具栏中的右侧和左侧有两个图标,否则标题将真正居中。在Android 8上测试。此外,我在类似的解决方案中发现了这个问题。

https://github.com/CrossGeeks/CustomNavigationBarSample/issues/3


共2个答案

匿名用户

我不确定您的效果是如何实现的,但下面的自定义渲染器似乎可以工作(与文本居中相关的部分在< code>ToolbarChildAdded方法中):

public class CustomNavigationPageRenderer : NavigationPageRenderer
{
    Android.Support.V7.Widget.Toolbar toolbar;

    public CustomNavigationPageRenderer(Context context) : base(context)
    {
    }

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

        if (e.OldElement != null)
        {
            this.toolbar.ChildViewAdded -= ToolbarChildAdded;
        }

        if (e.NewElement != null)
        {
            var toolbarId = Context.Resources.GetIdentifier("toolbar", "id", Context.PackageName);
            this.toolbar = this.FindViewById(toolbarId) as Android.Support.V7.Widget.Toolbar;
            this.toolbar.ChildViewAdded += ToolbarChildAdded;
        }
    }

    private void ToolbarChildAdded(object sender, ChildViewAddedEventArgs e)
    {
        if (e.Child is Android.Support.V7.Widget.AppCompatTextView tv)
        {
            // identify the title text view and center it
            tv.LayoutParameters = new Android.Support.V7.Widget.Toolbar.LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent, (int)GravityFlags.CenterHorizontal);
        }
    }
}

匿名用户

在Android上,标题视图不居中,左侧有一个16dp的边距。任何将内容居中的尝试都必须考虑到这一点。

使用自定义渲染器更容易重置此值。

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

    if (e.NewElement != null)
    {
        var toolbarId = Context.Resources.GetIdentifier("toolbar", "id", Context.PackageName);
        var toolbar = this.FindViewById(toolbarId) as Android.Support.V7.Widget.Toolbar;
        if (toolbar != null) toolbar.SetContentInsetsAbsolute(0, 0);
    }
}

确保在主活动中正确引用工具栏布局

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        //etc
    }
}

一旦这样做了,最简单的方法就是使用绝对布局来定位标题视图中的项目

<NavigationPage.TitleView>
    <AbsoluteLayout
        Padding="0"
        Margin="10,0,10,0">

        <Image
            AbsoluteLayout.LayoutBounds="0.5,0.5,130,31"
            AbsoluteLayout.LayoutFlags="PositionProportional"
            Source="logowhite.png">
        </Image>

        <ImageButton
            AbsoluteLayout.LayoutBounds="1,0.5,32,32"
            AbsoluteLayout.LayoutFlags="PositionProportional"
            Margin="0"
            WidthRequest="32"
            Source="settingsicon.png"
            Clicked="OnImageButtonClicked">
        </ImageButton>

    </AbsoluteLayout>
</NavigationPage.TitleView>