如何在 Xamarin.Android 中更改字体样式或覆盖完整应用程序的默认字体样式
How to change font style or override default font style for complete Application in Xamarin.Android
我发现许多 post 说要使用 FontAttribute="Font_Syle.tff#Font_Style"
从 xaml 文件静态更改每个 label/entry/button/etc etc
的字体样式,或者为每个 属性 喜欢 label/entry/button/etc
并为每个人单独更改 TypeFace
。
[assembly: ExportRenderer(typeof(Label), typeof(CustomLabel))]
namespace *******.Droid.Renderers
{
public class CustomLabel : LabelRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
var label = (TextView)Control;
Typeface font = Typeface.CreateFromAsset(Forms.Context.Assets, "Montserrat_Regular.ttf");
label.Typeface = font;
}
}
}
但是在为对话框、进度对话框、标题、以编程方式静态创建的列表等设置字体时出现问题
终于找到了解决方案,可以更改整个应用程序的字体。
(Java 有很多解决方案,但是 none 在 C# 中,所以在这里发布,这可能对以后的人有帮助)
Code Snippet
- 在 Resource/values/style.xml 中添加这个。请记住将其放置在应用主题的主要父级
STYLE
中。
<item name="android:typeface">serif</item>
- 在Droid项目中创建新文件名
TypefaceUtil
using Android.Content;
using Android.Graphics;
using Java.Lang;
namespace ***********.Droid
{
public class TypefaceUtil
{
/**
* Using reflection to override default typeface
* NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE OVERRIDDEN
* @param context to work with assets
* @param defaultFontNameToOverride for example "monospace"
* @param customFontFileNameInAssets file name of the font from assets
*/
public static void overrideFont(Context context, string defaultFontNameToOverride, string customFontFileNameInAssets)
{
try
{
var typeFace = Class.FromType(typeof(Typeface));
var customfont = Typeface.CreateFromAsset(context.Assets, customFontFileNameInAssets);
var font = typeFace.GetDeclaredField(defaultFontNameToOverride);
font.Accessible = true;
font.Set(null, customfont);
}
catch (System.Exception e)
{
var error = e.Message;
}
}
}
}
- 在扩展Application的MainActivity中,调用above-created方法
public class MainApplication : Application
{
public override void OnCreate()
{
base.OnCreate();
TypefaceUtil.overrideFont(Context, "SERIF", "Montserrat_Regular.ttf"); // font from assets: "assets/fonts/Montserrat_Regular.ttf
}
}
Note: Place your Font tff file in Asset folder of Resource
就是这样,字体已准备就绪,可以使用了:)
我发现许多 post 说要使用 FontAttribute="Font_Syle.tff#Font_Style"
从 xaml 文件静态更改每个 label/entry/button/etc etc
的字体样式,或者为每个 属性 喜欢 label/entry/button/etc
并为每个人单独更改 TypeFace
。
[assembly: ExportRenderer(typeof(Label), typeof(CustomLabel))]
namespace *******.Droid.Renderers
{
public class CustomLabel : LabelRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
var label = (TextView)Control;
Typeface font = Typeface.CreateFromAsset(Forms.Context.Assets, "Montserrat_Regular.ttf");
label.Typeface = font;
}
}
}
但是在为对话框、进度对话框、标题、以编程方式静态创建的列表等设置字体时出现问题
终于找到了解决方案,可以更改整个应用程序的字体。
(Java 有很多解决方案,但是 none 在 C# 中,所以在这里发布,这可能对以后的人有帮助)
Code Snippet
- 在 Resource/values/style.xml 中添加这个。请记住将其放置在应用主题的主要父级
STYLE
中。
<item name="android:typeface">serif</item>
- 在Droid项目中创建新文件名
TypefaceUtil
using Android.Content;
using Android.Graphics;
using Java.Lang;
namespace ***********.Droid
{
public class TypefaceUtil
{
/**
* Using reflection to override default typeface
* NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE OVERRIDDEN
* @param context to work with assets
* @param defaultFontNameToOverride for example "monospace"
* @param customFontFileNameInAssets file name of the font from assets
*/
public static void overrideFont(Context context, string defaultFontNameToOverride, string customFontFileNameInAssets)
{
try
{
var typeFace = Class.FromType(typeof(Typeface));
var customfont = Typeface.CreateFromAsset(context.Assets, customFontFileNameInAssets);
var font = typeFace.GetDeclaredField(defaultFontNameToOverride);
font.Accessible = true;
font.Set(null, customfont);
}
catch (System.Exception e)
{
var error = e.Message;
}
}
}
}
- 在扩展Application的MainActivity中,调用above-created方法
public class MainApplication : Application
{
public override void OnCreate()
{
base.OnCreate();
TypefaceUtil.overrideFont(Context, "SERIF", "Montserrat_Regular.ttf"); // font from assets: "assets/fonts/Montserrat_Regular.ttf
}
}
Note: Place your Font tff file in Asset folder of Resource
就是这样,字体已准备就绪,可以使用了:)