注入默认字体

Posted

技术标签:

【中文标题】注入默认字体【英文标题】:Injection of Default Typeface 【发布时间】:2015-03-09 19:49:13 【问题描述】:

目标:

通过 MvvmCross 在 Xamarin 中隐式(通过默认)和显式(通过查看代码)动态主题字体。

背景:

确定了两个出色的 android 字体自定义实现:

Calligraphy Calligraphy-Xamarin

Calligraphy 拦截 Android 视图的膨胀(使用 Android 上下文包装器),并对其进行操作以生成所需的效果。

MvvmCross 已被采用并在 Android 视图膨胀期间执行其操作。

与其引入另一种技术(Calligraphy-Xamarin),不如说是特定于平台的——我想知道是否有一种雄辩的方式来实现一个使用 MvvmCross 的跨平台、动态字体主题引擎。

将跨平台进程注入到 MvvmCross 创建视图中...这将执行隐式和显式字体主题。

建议、想法和/或 cmets,任何人?

【问题讨论】:

【参考方案1】:

解决方案是将 MvvmCross 绑定 inflate 替换为首先调用 Calligraphy 的 inflate 逻辑的修改版本。请记住,它们是开源项目,因此这是可能的,但必须以维护源代码分支为代价。

最后在 MvvmCross 的容器中注册的内容都会获胜——因此您只需将修改后的版本从 MvvmCross 的绑定 inflate 最后注入。

希望这是有道理的...如果不是,请不要犹豫,要求提供更多信息和/或澄清。

其他信息...

我不再有权访问该源代码,也无法使用开发环境为您创建有效的解决方案。也就是说,对于使用 Xamarin 创建 Android 解决方案的软件开发人员来说,以下信息应该足够了。

    检索以下项目并将其添加到您的解决方案中(书法) https://github.com/mikescandy/Calligraphy-xamarin 从您的 Android 特定项目中添加对此项目的引用。

    检索以下项目并将其添加到您的解决方案 (MvvmCross) https://github.com/MvvmCross/MvvmCross 不要在任何地方添加对该项目的引用。

    将 MvvmCross 的 MvxAndroidBindingContext.cs 单元复制到您的 Android 项目中(建议更改命名空间),然后修改其... public virtual View BindingInflate(int resourceID, ViewGroup viewGroup) 以便在使用 MvvmCross 绑定创建 View 后调用 CalligraphyFactory.cs OnViewCreated() 方法。 CalligraphyFactory::OnViewCreated() 是应用字体的地方,而 MvxAndroidBindingContext::BindingInflate() 是应用 MvvmCross 绑定创建视图的地方。

    查看 MvvmCross 如何在其项目中注册 MvxAndroidBindingContext,然后对您的实现执行相同的操作,确保它是 LAST,因此它将覆盖原来的。如果我没记错的话,这将在 Setup::CreateApp() 方法中完成。

    确保正确初始化 Calligraphy(请参阅其文档)。

您可能需要一段时间才能理解我所写的内容,并且可能会有一些错误,因为已经过去了很多时间,我没有能力检查它,但我 100% 确定IDEA 将成功地将 Calligraphy 包含在 Xamarin / MvvmCross 中,因为毫无疑问我确实让它工作了。

【讨论】:

感谢您的快速回复!是的,我明白你的意思。你自己做过这个改变吗?你愿意分享一些代码吗? MVVMCross 相当新,所以我有点犹豫是否要对其进行任何更改! 请参考更新后的“答案”。如果您觉得慷慨,也请标记为“答案” 非常感谢详细的回答!谢谢!!它不会让我将其标记为答案,因为我没有问这个问题。对不起!!再次感谢 我不明白这是如何工作的。可能是因为随着时间的推移事情发生了变化,但是:a) Mvvm 没有为 MvxAndroidBindingContext 使用注入,它只是在 MvxActivity 中执行新的 MvxAndroidBindingContext。您可以在自己的活动中替换它。到目前为止,我看到了一个解决方案。 b) CalligraphyFactory 是私有的,因此无法访问。仍在寻找另一种解决方法。但书法的设计远非公开,私事多。【参考方案2】:

这有什么好运气吗? MvvmCross 和 Calligraphy-XamariM 似乎不能很好地结合在一起。我得到 "Android.Views.InflateException" 。我猜这是因为两个库都试图覆盖视图膨胀过程。

【讨论】:

请参考我修改后的“答案”【参考方案3】:

我发布了一个 Nuget 包,基本上就是 WindSpirit 所说的。 https://www.nuget.org/packages/MvvmCross.Calligraphy/.

Calligraphy-Xamarin 的问题在于 CalligraphyFactory 不公开。你只需要像这样修改设置:

public class Setup : MvxAndroidSetup

    protected override MvxAndroidBindingBuilder CreateBindingBuilder()
    
        return new CalligraphyMvxAndroidBindingBuilder();
    
 

【讨论】:

以上是关于注入默认字体的主要内容,如果未能解决你的问题,请参考以下文章

手机端 默认字体

inkscape怎么增加默认字体的种类

chrome浏览器字体改变,如何设置恢复默认字体

chrome浏览器字体改变,如何设置恢复默认字体

iMindMap中默认字体大小怎么调

LibreOffice办公软件怎么设置默认字体