在 Xamarin 表单中使用效果的 Android 工具栏中心
Posted
技术标签:
【中文标题】在 Xamarin 表单中使用效果的 Android 工具栏中心【英文标题】:Android Tool Bar Center using Effects in Xamarin forms 【发布时间】:2018-07-23 08:21:46 【问题描述】:我试图在 Xamarin 表单中将 android 中的页面标题居中。 我可以访问工具栏并且能够设置字体系列。但我无法将文本对齐或重心设置为居中。
var context = (Android.App.Activity)Forms.Context;
var toolbar = context.Resources.GetIdentifier("toolbar", "id", context.PackageName);
var view = context.FindViewById(toolbar);
我尝试了以下方法:
前景重力
view.SetForegroundGravity(GravityFlags.Center);
文本对齐
view.TextAlignment = Android.Views.TextAlignment.Center;
访问工具栏的子级并设置方向和对齐方式。
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: 我能够根据下面的答案将以下内容添加到效果中,并且它以某种方式使元素居中但不完全位于中心。不知何故,它在中心的右侧,除非在工具栏的右侧和左侧有 2 个图标,那么,标题将真正居中。在 Android 8 上测试。另外,我在类似的解决方案中发现了这个问题。
https://github.com/CrossGeeks/CustomNavigationBarSample/issues/3
【问题讨论】:
我尝试使用这些样式,但发现使用起来很复杂,并且无法响应我的更改 你应该在你的Android项目中找到这个文件toolbar.axml
。只需在您的 XML 中使用 TextView
作为标题
你的意思是我必须添加 TextView 并从 MainActivity 访问它?像这样 g
是否为 TextView
,如果为真则转换它,然后尝试访问 gravity
字段
【参考方案1】:
我不确定您的 Effect 是如何实现的,但以下自定义渲染器似乎可以工作(与居中文本相关的位在 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);
【讨论】:
感谢您的回答,请检查我的问题上的编辑#2 如果左侧或右侧有图标,则标题实际上不在中心。如果工具栏中有子项,您能否建议一种正确分隔它们的方法? 从头开始,我做了更多测试。如果标题很长,它会出于某种原因向右移动,但如果标题很小,它会正确居中。 我授予这个答案不是因为它是最好的,而是为了获得手动奖励积分的徽章。如果有人有同样的问题,我建议他们使用自定义导航布局,这将允许您在工具栏中创建自己的布局。在这里查看更多信息:doumer.me/a-look-at-new-xamarin-forms-features【参考方案2】:在 Android 上,Title View 不居中,左侧有 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>
【讨论】:
以上是关于在 Xamarin 表单中使用效果的 Android 工具栏中心的主要内容,如果未能解决你的问题,请参考以下文章
在 LongPress 上显示 ContextMenu 以获取 xamarin 表单中的视图
Xamarin Android - 带有图标的条目 - SetCompoundDrawablesWithIntrinsicBounds - TOUCH/Click 事件?