我正在尝试以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
我不确定您的效果是如何实现的,但下面的自定义渲染器似乎可以工作(与文本居中相关的部分在< 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>