我正在尝试更改应用中的默认字体。但它不起作用。这些是我采取的步骤:
1)创建了类 TypefaceUtil.java
import android.content.Context;
import android.graphics.Typeface;
import android.util.Log;
import java.lang.reflect.Field;
public class TypefaceUtil {
public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
try {
final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);
final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
defaultFontTypefaceField.setAccessible(true);
defaultFontTypefaceField.set(null, customFontTypeface);
} catch (Exception e) {
Log.e("CustomFontException", "Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
}
}
}
2)在扩展应用程序:
的类中public void onCreate() {
super.onCreate();
TypefaceUtil.overrideFont(getApplicationContext(), "MONOSPACE", "fonts/varelaround_regular.ttf");
}
3)在 styles.xml
中 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:typeface">monospace</item>
</style>
仍然无法正常工作。我错过了什么吗?
答案 0 :(得分:2)
我曾经遇到过这个问题。我不太清楚为什么会这样,但你可以尝试以下方法: 而不是“等宽”,尝试以下各项: DEFAULT,SANS_SERIF,SERIF。它可能不适用于所有文本视图,例如ListView或recyclerView中的文本视图(很奇怪,对吧?)。但在这些情况下,我以编程方式从适配器设置字体。 很抱歉无法解释原因。
答案 1 :(得分:1)
为此,我强烈建议您使用Calligraphy
,https://github.com/chrisjenx/Calligraphy,一个非常棒的库,真正的直接改变默认字体,并具有许多其他有用的功能。
您需要设置的所有内容都应该在自述文件中。
答案 2 :(得分:0)
为什么不定义自定义TextView并为其指定任何字体。
import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.EditText;
import com.exmple.util.Utility;
public class CustomFontEditText extends EditText {
private Context mContext;
private String ttfName;
String TAG = getClass().getName();
public CustomFontEditText(Context context) {
super(context);
this.mContext = context;
}
public CustomFontEditText(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
// Typeface.createFromAsset doesn't work in the layout editor.
// Skipping...
if (isInEditMode()) {
return;
}
for (int i = 0; i < attrs.getAttributeCount(); i++) {
this.ttfName = attrs.getAttributeValue(Utility.ATTRIBUTE_SCHEMA,
Utility.ATTRIBUTE_TTF_KEY);
if (null != ttfName)
init();
}
}
public CustomFontEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.mContext = context;
}
private void init() {
Typeface font = Utility.getFonts(mContext, ttfName);
if (null != font)
setTypeface(font);
}
@Override
public void setTypeface(Typeface tf) {
super.setTypeface(tf);
}
}
在Utility类的哈希映射中加载和存储资产中的字体,以便以后可以重用字体。想象一下每次加载新视图时加载字体.. OOM .. !!!
private static Map<String, Typeface> TYPEFACE = new HashMap<String, Typeface>();
public static Typeface getFonts(Context context, String fontName) {
Typeface typeface = TYPEFACE.get(fontName);
if (typeface == null) {
typeface = Typeface.createFromAsset(context.getAssets(), "fonts/"+fontName);
TYPEFACE.put(fontName, typeface);
}
return typeface;
}
添加ttf属性以从xml
设置字体public static final String ATTRIBUTE_TTF_KEY = "ttf_name";
public static final String ATTRIBUTE_SCHEMA = "http://schemas.android.com/apk/lib/com.exmaple.ui.customfont";
现在在你的布局文件中使用
<com.example.ui.customviews.CustomFontEditText
xmlns:font="http://schemas.android.com/apk/lib/com.exmaple.ui.customfont"
android:id="@+id/edt_pay_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:background="@null"
android:cursorVisible="false"
android:drawableBottom="@drawable/dashed_white"
android:includeFontPadding="false"
android:inputType="numberDecimal"
android:maxLength="4"
android:minWidth="20dp"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="30sp"
font:ttf_name="FedraSansStd-Light.otf" >
<requestFocus />
</com.example.ui.customviews.CustomFontEditText>
您可以对Button,TextView等执行相同的操作。