注入默认字体
Posted
技术标签:
【中文标题】注入默认字体【英文标题】:Injection of Default Typeface 【发布时间】:2015-03-09 19:49:13 【问题描述】:目标:
通过 MvvmCross 在 Xamarin 中隐式(通过默认)和显式(通过查看代码)动态主题字体。
背景:
确定了两个出色的 android 字体自定义实现:
Calligraphy Calligraphy-XamarinCalligraphy 拦截 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();
【讨论】:
以上是关于注入默认字体的主要内容,如果未能解决你的问题,请参考以下文章