gpt4 book ai didi

android - 为什么我在 Android 应用程序中的自定义字体在 Release模式下被默认字体替换?

转载 作者:行者123 更新时间:2023-11-29 01:15:40 24 4
gpt4 key购买 nike

当我在 Debug模式下构建和部署包含自定义字体的 Xamarin.android 应用程序时,一切正常。我可以在应用程序中看到自定义 ttf 字体。但是,当我在 Release模式下构建和部署相同的应用程序时,当我运行它时,我会在其中看到默认字体。是否应在应用属性中添加一些必需的权限,以便自定义字体在应用中可见?

以下是我在我的应用中使用字体的方式:

  1. 转换器类中的转换方法:

    protected override Typeface Convert(string fontName, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
    try
    {
    if (!fontName.StartsWith(@"font/")) fontName = @"font/" + fontName;
    if (!fontName.EndsWith(".ttf")) fontName += ".ttf";

    if (!_cache.ContainsKey(fontName))
    {
    _cache[fontName] = Typeface.CreateFromAsset(Application.Context.Assets, fontName);
    }

    return _cache[fontName];
    }
    catch (Exception e)
    {
    Android.Util.Log.Error("AndroidFont", e.ToString());

    return Typeface.Default;
    }
    }
  2. AXML 中的项目

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    >
    <TextView
    android:layout_width="180dp"
    android:layout_height="wrap_content"
    android:textColor="#AAAAAA"
    local:MvxBind="Typeface StringToFont('Lato'), Converter=StringToFontConverter" /></LinearLayout>
  3. 在 Setup.cs 中注册转换器

    protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
    {
    registry.RegisterFactory(new MvxCustomBindingFactory<View>("StringToFont", view => new BackgroundBinding(view)));
    }

TTF 字体位于 Assets/fonts 目录中。我在 Visual Studio Community 2015 (C#) 上工作。

一切正常,但仅限于 Debug模式。当我切换到 Release 模式时,我的字体 (Lato) 被默认的 Android 字体取代。为什么?

最佳答案

  1. 创建 MvxViewFontBinding

    public abstract class MvxViewFontBinding : MvxAndroidTargetBinding
    {
    protected TextView TextView => (TextView)base.Target;
    public MvxViewFontBinding(TextView view) : base(view)
    {
    }

    public override MvxBindingMode DefaultMode => MvxBindingMode.OneWay;

    public override Type TargetType => typeof(Android.Graphics.Typeface);
    }
  2. 创建 MvxViewCustomFontBinding

    public class MvxViewCustomFontBinding : MvxViewFontBinding
    {
    public MvxViewCustomFontBinding(TextView view) : base(view)
    {
    }

    protected override void SetValueImpl(object target, object value)
    {
    var textView = (TextView)target;
    textView?.SetTypeface((Android.Graphics.Typeface)value, Android.Graphics.TypefaceStyle.Normal);
    }
    }
  3. 在 Setup.cs 中注册

    protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
    {
    registry.RegisterFactory(new MvxCustomBindingFactory<TextView>("CustomFont", textView => new MvxViewCustomFontBinding(textView)));
    base.FillTargetFactories(registry);
    }
  4. 你可以绑定(bind)在axml上

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff">
    <TextView
    android:layout_width="180dp"
    android:layout_height="wrap_content"
    android:textColor="#AAAAAA"
    local:MvxBind="CustomFont StringToFont('Lato')" /></LinearLayout>

关于android - 为什么我在 Android 应用程序中的自定义字体在 Release模式下被默认字体替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39864114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com