Câu trả lời ngắn gọn: Không. Android không có hỗ trợ tích hợp để áp dụng phông chữ tùy chỉnh cho các widget văn bản thông qua XML.
Tuy nhiên, có một cách giải quyết không quá khó thực hiện.
Đầu tiên
Bạn sẽ cần xác định kiểu tạo kiểu của riêng mình. Trong thư mục / res / values của bạn, mở / tạo tệp attrs.xml và thêm một đối tượng có thể khai báo kiểu như sau:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="FontText">
<attr name="typefaceAsset" format="string"/>
</declare-styleable>
</resources>
Thứ hai
Giả sử bạn muốn sử dụng tiện ích này thường xuyên, bạn nên thiết lập một bộ đệm ẩn đơn giản cho các Typeface
đối tượng được tải , vì việc tải chúng từ bộ nhớ khi đang di chuyển có thể mất nhiều thời gian. Cái gì đó như:
public class FontManager {
private static FontManager instance;
private AssetManager mgr;
private Map<String, Typeface> fonts;
private FontManager(AssetManager _mgr) {
mgr = _mgr;
fonts = new HashMap<String, Typeface>();
}
public static void init(AssetManager mgr) {
instance = new FontManager(mgr);
}
public static FontManager getInstance() {
if (instance == null) {
// App.getContext() is just one way to get a Context here
// getContext() is just a method in an Application subclass
// that returns the application context
AssetManager assetManager = App.getContext().getAssets();
init(assetManager);
}
return instance;
}
public Typeface getFont(String asset) {
if (fonts.containsKey(asset))
return fonts.get(asset);
Typeface font = null;
try {
font = Typeface.createFromAsset(mgr, asset);
fonts.put(asset, font);
} catch (Exception e) {
}
if (font == null) {
try {
String fixedAsset = fixAssetFilename(asset);
font = Typeface.createFromAsset(mgr, fixedAsset);
fonts.put(asset, font);
fonts.put(fixedAsset, font);
} catch (Exception e) {
}
}
return font;
}
private String fixAssetFilename(String asset) {
// Empty font filename?
// Just return it. We can't help.
if (TextUtils.isEmpty(asset))
return asset;
// Make sure that the font ends in '.ttf' or '.ttc'
if ((!asset.endsWith(".ttf")) && (!asset.endsWith(".ttc")))
asset = String.format("%s.ttf", asset);
return asset;
}
}
Cái này sẽ cho phép bạn sử dụng phần mở rộng tệp .ttc, nhưng nó chưa được kiểm tra.
Ngày thứ ba
Tạo một lớp mới phân lớp con TextView
. Ví dụ cụ thể này có tính đến kiểu chữ XML đã xác định ( bold
, italic
v.v.) và áp dụng nó vào phông chữ (giả sử bạn đang sử dụng tệp .ttc).
/**
* TextView subclass which allows the user to define a truetype font file to use as the view's typeface.
*/
public class FontText extends TextView {
public FontText(Context context) {
this(context, null);
}
public FontText(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public FontText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
if (isInEditMode())
return;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.FontText);
if (ta != null) {
String fontAsset = ta.getString(R.styleable.FontText_typefaceAsset);
if (!TextUtils.isEmpty(fontAsset)) {
Typeface tf = FontManager.getInstance().getFont(fontAsset);
int style = Typeface.NORMAL;
float size = getTextSize();
if (getTypeface() != null)
style = getTypeface().getStyle();
if (tf != null)
setTypeface(tf, style);
else
Log.d("FontText", String.format("Could not create a font from asset: %s", fontAsset));
}
}
}
}
Cuối cùng
Thay thế các trường hợp TextView
trong XML của bạn bằng tên lớp đủ điều kiện. Khai báo không gian tên tùy chỉnh của bạn giống như bạn làm với không gian tên Android. Lưu ý rằng "typefaceAsset" phải trỏ đến tệp .ttf hoặc .ttc có trong thư mục / asset của bạn.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.FontText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is a custom font text"
custom:typefaceAsset="fonts/AvenirNext-Regular.ttf"/>
</RelativeLayout>