微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin Android TabbedPage在标签上显示FontAwesome图标

如何解决Xamarin Android TabbedPage在标签上显示FontAwesome图标

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

我的TabbedPage用代码定义,我最初在其构造函数中为子页面设置了IconImageSource。在iOS中,这似乎是显示png文件所需的全部工作,但是在Android中,这是行不通的(尽管我认为应该这样做,但不知道为什么不行),所以我似乎需要自定义渲染器即使对于png。如果我向每个ContentPage类添加“ IconName”字段并将其值设置为png文件名称(不带.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 }; 

在我的共享项目中通过App类的名称空间添加了此属性

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

但是,我在TabbedRenderer覆盖中使用的SetIcon方法仅接受ResourceID或Drawable作为参数,并且我不确定如何从FontAwesome图标生成其中之一。我尝试在自定义渲染器中按以下方式使用eddydn的TextDrawable NuGet程序包,该程序可以编译并运行,但是没有显示图标:

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调用的可绘制对象,方法是使用定义为here的IconDrawable类(并根据导入的方式修改IconDrawable中设置Typeface使用Create或CreateFromAsset的行。 FontAwesome),像这样:

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添加到项目中的旧方法时-在Droid项目(.otf或.ttf)的Assets文件夹下添加FontAwesome并调用

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

(或.ttf)以获取字体-工作正常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。