gpt4 book ai didi

android - Android 上的自定义字体和自定义 TextView

转载 作者:IT王子 更新时间:2023-10-28 23:35:42 27 4
gpt4 key购买 nike

从我需要开发的应用程序中,我收到了包含许多文件的特定字体,例如 FontName-Regular、FontName-BoldFontName-it。我需要在应用程序的所有 TextView 中使用它。首先,我认为这是一项简单的任务。查看SO,发现一个非常好的线程:here

所以首先我确实喜欢:

public static void overrideFonts(final Context context, final View v) {
try {
if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {
View child = vg.getChildAt(i);
overrideFonts(context, child);
}
} else if (v instanceof TextView) {
((TextView)v).setTypeface(FONT_REGULAR);
}
} catch (Exception e) {
e.printStackTrace();
// ignore
}
}

并在我的 Activity 中的 onCreate 期间调用了此方法。我的应用程序中的每个 textView 都显示了那个字体和男孩,我很高兴能如此轻松地离开。直到我进入一个屏幕,其中一些 TextView 需要 Bold 作为 Style (android:textStyle="bold")。然后我意识到这个解决方案不能让我从 Assets 中加载 Font-Bold.ttf。

在同一个 SO 问题中,进一步查看并看到了一个不错的自定义 TextView 实现:

public class MyTextView extends TextView {

public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}

public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

public MyTextView(Context context) {
super(context);
init();
}

public void init() {

Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font/chiller.ttf");
setTypeface(tf ,1);

}
}

这看起来更好。我的问题是:如何在 init() 上检测我的控件是否将 Style 设置为 Bold 以便我可以分配请求的 TypeFace ?

感谢您的宝贵时间。

乐。按照下面的示例,我将我的类(class)更新为:

public class MyTextView extends TextView {

Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_REGULAR);
Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_BOLD);

public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public MyTextView(Context context) {
super(context);
}

public void setTypeface(Typeface tf, int style) {
if (style == Typeface.BOLD) {
super.setTypeface(boldTypeface/*, -1*/);
} else {
super.setTypeface(normalTypeface/*, -1*/);
}
}
}

好吧,如果我调试,应用程序进入 setTypeFace 并且它似乎应用了粗体,但在我的布局上我看不到任何变化,而不是粗体。无论我使用什么字体,我的 TextView 都不会进行任何更改,并使用默认的 android 字体显示。我想知道为什么?

我在一篇博文中总结了所有内容 here on my blog也许它会帮助某人。

最佳答案

TextView 的构造函数调用 setTypeface(Typeface tf, int style) 使用从 XML 属性 android 检索到的 style 参数:textStyle。因此,如果您想拦截此调用以强制使用您自己的字体,您可以重写此方法,如下所示:

public void setTypeface(Typeface tf, int style) {
Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_normal_font.ttf");
Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_bold_font.ttf");

if (style == Typeface.BOLD) {
super.setTypeface(boldTypeface/*, -1*/);
} else {
super.setTypeface(normalTypeface/*, -1*/);
}
}

关于android - Android 上的自定义字体和自定义 TextView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8954484/

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