我需要在我的应用中为不同的标签指定不同的FontFamily。我需要使用默认字体(例如Android的Roboto和iOS的Helvetica)及其修改(例如Light,Medium,Bold)。据我所知,我应该使用Roboto-Light和Helvetica-Light来获得Light版本的字体(同样适用于Medium和Bold)。 除了这个要求,我需要在XAML中设置字体(如described in documentation),所以我最终得到这个代码
<StackLayout BackgroundColor="#F8F8F8" Padding="0, 20, 0, 0">
<Label Text="Black" TextColor="#000000" >
<Label.FontSize>
<OnPlatform x:TypeArguments="x:Double"
iOS="17"
Android="16"
WinPhone="16" />
</Label.FontSize>
<Label.FontFamily>
<OnPlatform x:TypeArguments="x:String">
<OnPlatform.iOS>Helvetica-Black</OnPlatform.iOS>
<OnPlatform.Android>Roboto-Black</OnPlatform.Android>
<OnPlatform.WinPhone></OnPlatform.WinPhone>
</OnPlatform>
</Label.FontFamily>
</Label>
<Label Text="Light" TextColor="#000000">
<Label.FontSize>
<OnPlatform x:TypeArguments="x:Double"
iOS="17"
Android="16"
WinPhone="16" />
</Label.FontSize>
<Label.FontFamily>
<OnPlatform x:TypeArguments="x:String">
<OnPlatform.iOS>Helvetica-Light</OnPlatform.iOS>
<OnPlatform.Android>Roboto-Light</OnPlatform.Android>
<OnPlatform.WinPhone></OnPlatform.WinPhone>
</OnPlatform>
</Label.FontFamily>
</Label>
<Label Text="Medium" TextColor="#000000" >
<Label.FontSize>
<OnPlatform x:TypeArguments="x:Double"
iOS="17"
Android="16"
WinPhone="16" />
</Label.FontSize>
<Label.FontFamily>
<OnPlatform x:TypeArguments="x:String">
<OnPlatform.iOS>Helvetica-Medium</OnPlatform.iOS>
<OnPlatform.Android>Roboto-Medium</OnPlatform.Android>
<OnPlatform.WinPhone></OnPlatform.WinPhone>
</OnPlatform>
</Label.FontFamily>
</Label>
<Label Text="Bold" TextColor="#000000">
<Label.FontSize>
<OnPlatform x:TypeArguments="x:Double"
iOS="17"
Android="16"
WinPhone="16" />
</Label.FontSize>
<Label.FontFamily>
<OnPlatform x:TypeArguments="x:String">
<OnPlatform.iOS>Helvetica-Bold</OnPlatform.iOS>
<OnPlatform.Android>Roboto-Bold</OnPlatform.Android>
<OnPlatform.WinPhone></OnPlatform.WinPhone>
</OnPlatform>
</Label.FontFamily>
</Label>
但是,Android中的结果是出乎意料的。不同标签的FontFamily不会更改。它们看起来都一样。
iOS中的相同代码按预期工作
我的问题是:如果关注我的Android应用中如何获得 Roboto-Light , Roboto-Medium 和 Roboto-Bold 字体XAMARIN文档不起作用?
答案 0 :(得分:4)
更新:
我没有看到你第一次使用API 18 / 4.3(在模拟器的标题栏中),以为你是将它们作为旧版Android版本的自定义资源加载。由于roboto是4.1以来的默认字体,因此您可以将它们用作:
原件:
https://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/fonts/
Android版Xamarin.Forms目前尚未公开设置功能 自定义字体文件的字体,因此需要自定义渲染器。什么时候 为Android平台编写渲染器,创建一个Typeface 引用已添加到的自定义字体文件的实例 应用程序的Assets目录(使用Build Action:AndroidAsset)。
[assembly: ExportRenderer (typeof (MyLabel), typeof (MyLabelRenderer))]
namespace WorkingWithFonts.Android {
public class MyLabelRenderer : LabelRenderer {
protected override void OnElementChanged (ElementChangedEventArgs<Label> e) {
base.OnElementChanged (e);
var label = (TextView)Control; // for example
Typeface font = Typeface.CreateFromAsset (Forms.Context.Assets, "SF Hollywood Hills.ttf");
label.Typeface = font;
}
}
}
答案 1 :(得分:1)
我为我需要的所有视图覆盖了默认的渲染器。
通过这种方式,您可以按照以下方式使用XAML代码:
<Label FontFamily="Arial" Text="Hi there" />
以下是Label的示例。
[assembly: ExportRenderer (typeof (Label), typeof (MyLabelRenderer))]
namespace MyApp.Droid
{
public class MyLabelRenderer : LabelRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
if ( !String.IsNullOrEmpty(Element.FontFamily) )
Control.Typeface = Typeface.CreateFromAsset(Forms.Context.Assets, "Fonts/" + Element.FontFamily + ".otf");
}
}
}
当然,您需要将其映射到嵌入自定义字体的位置。在我的情况下资产/字体/ Arial.otf 。
答案 2 :(得分:0)
请使用下面的渲染,在标签中加载自定义字体,请确保将您的字体文件放在android项目资源文件夹的fonts文件夹中,为所有平台定义类似的路径
[assembly: ExportRenderer(typeof(Label), typeof(CustomLabelRenderer))]
namespace MyApp.Droid.Renderer
{
public class CustomLabelRenderer : LabelRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
if (!String.IsNullOrEmpty(e.NewElement.FontFamily))
Control.Typeface = Typeface.CreateFromAsset(Forms.Context.Assets, "Fonts/" + Element.FontFamily);
}
}
}
标签控件的xaml,请确保字体文件夹中有字体文件
<Label FontFamily="Roboto-Light.ttf" Text="Hi there" />
答案 3 :(得分:0)
截至2018年,在Xamairn.Forms中,不再需要平台渲染器。步骤是:
Here's detailed description,介绍如何在macOS,WPF和Android中添加和应用自定义字体。