Xamarin Android选项卡页面在选项卡上显示FontAwesome图标



我想在Xamarin应用程序的Android TabbedPage选项卡上显示图标和文本,我希望它们是FontAwesome字形,而不是png文件。

我的TabbedPage是在代码中定义的,我最初在它们的构造函数中为子页面设置了IconImageSource。在iOS中,我似乎只需要做这些就可以显示png文件,但在Android中,这不起作用(尽管我认为它应该有,但不知道为什么没有(,所以我似乎需要一个自定义的渲染器,即使是png。如果我添加一个";IconName";字段,并将其值设置为png文件的名称(不带.png扩展名(:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.OS;
using Android.Runtime;
using Android.Support.Design.Internal;
using Android.Support.Design.Widget;
using Android.Support.V4.Content;
using Android.Views;
using Android.Widget;
using Origami.MobileForms.Droid.Renderers;
using Origami.MobileForms.Pages;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;
[assembly: ExportRenderer(typeof(FormTabbedPage), typeof(ExtendedTabbedPageRenderer))]
namespace Origami.MobileForms.Droid.Renderers
{
public class ExtendedTabbedPageRenderer : TabbedRenderer
{
public ExtendedTabbedPageRenderer(Context context) : base(context) { }
protected override void DispatchDraw(global::Android.Graphics.Canvas canvas)
{
base.DispatchDraw(canvas);
SetTabIcons();
}
private void SetTabIcons()
{
var element = this.Element;
if (null == element)
{
return;
}
Activity activity = this.Context as Activity;
if ((null != activity && null != activity.ActionBar && activity.ActionBar.TabCount > 0))
{
for (int i = 0; i < element.Children.Count; i += 1)
{
Android.App.ActionBar.Tab tab = activity.ActionBar.GetTabAt(i);
var page = element.Children[i];
if ((null != tab) && (null != page) && (null != page.IconImageSource))
{
var customImagePage = page as ICustomImagePage;
if(customImagePage != null)
{
var resourceId = Resources.GetIdentifier(customImagePage.IconName.ToLower(), "drawable", Context.PackageName);
tab.SetIcon(resourceId);
}
}
}
}
}
}
}

我想知道如何在这里使用FontAwesome图标而不是.png文件。我确实想好了如何在我的ContentPage:中使用FontAwesome图标作为IconImageSource

this.IconImageSource = new FontImageSource { FontFamily = "fa-solid", Size = 30,  Glyph= "uf15c", Color = Color.Red }; 

在我的共享项目中,通过应用程序类的名称空间添加了这个属性:

[assembly: ExportFont("fa-solid-900.ttf", Alias = "fa-solid")]

然而,我在TabbedRenderer覆盖中使用的SetIcon方法只接受ResourceID或Drawable作为参数,我不知道如何从FontAwesome图标生成其中任何一个。我试着在我的自定义渲染器中使用eddydn的TextDrawableNuGet包,如下所示,它编译并运行,但没有显示图标:

private void SetTabIcons()
{
var element = this.Element;
if (null == element)
{
return;
}
Activity activity = this.Context as Activity;
if ((null != activity && null != activity.ActionBar && activity.ActionBar.TabCount > 0))
{
for (int i = 0; i < element.Children.Count; i += 1)
{
var page = element.Children[i];
if ((null != tab) && (null != page) && (null != page.IconImageSource))
{
var customImagePage = page as ICustomImagePage;
if(customImagePage != null)
{
Typeface font = Typeface.Create("fa-solid", TypefaceStyle.Normal);
TextDrawable icon = new TextDrawable.Builder().BeginConfig().TextColor(Android.Graphics.Color.Red).UseFont(font)
.FontSize(30).EndConfig()
.BuildRect("uf15c", Android.Graphics.Color.Red);
tab.SetIcon(icon);
}
}
}
}
}

我还尝试了另一种方法来获得SetIcon调用的可绘制对象,使用这里定义的IconDrawable类(并根据我导入FontAwesome的方式修改IconDrawble中设置Typeface使用Create或CreateFromAsset的行(,如下所示:

var drawable = new IconDrawable(this.Context, "uf15c";", "fa-solid").Color(Xamarin.Forms.Color.Red.ToAndroid()).SizeDp(30);

提前感谢您提供的任何帮助!

我的最后一次尝试几乎完成了——问题是我试图将IconDrawable设置为:

Typeface.Create(fontFacePath, TypefaceStyle.Normal);

我希望这将使用我在共享项目中包含的文件创建字体,并通过属性添加到该项目的代码中,但也许以这种新的方式包含这些文件并不能使字体在Droid项目中访问。。。无论如何,当我使用旧的方式将FontAwesome添加到项目中时,将FontAwosome添加在Droid项目的Assets文件夹下(可以是.otf或.ttf(,并调用

Typeface.CreateFromAsset(context.Assets, $"{fontFacePath}.otf") 

(或.ttf(来获得字体-效果很好。

最新更新