คำตอบสั้น ๆ : ไม่ Android ไม่มีการสนับสนุนในตัวสำหรับการใช้แบบอักษรที่กำหนดเองกับวิดเจ็ตข้อความผ่าน XML
อย่างไรก็ตามมีวิธีแก้ปัญหาที่ไม่ยากในการนำไปใช้
อันดับแรก
คุณจะต้องกำหนดรูปแบบของคุณเอง ในโฟลเดอร์ / res / values ของคุณให้เปิด / สร้างไฟล์ attrs.xml และเพิ่มอ็อบเจ็กต์ที่กำหนดรูปแบบได้ดังนี้:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="FontText">
<attr name="typefaceAsset" format="string"/>
</declare-styleable>
</resources>
ประการที่สอง
สมมติว่าคุณต้องการใช้วิดเจ็ตนี้บ่อยๆคุณควรตั้งค่าแคชอย่างง่ายสำหรับTypeface
อ็อบเจ็กต์ที่โหลดเนื่องจากการโหลดจากหน่วยความจำทันทีอาจใช้เวลานาน สิ่งที่ต้องการ:
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) {
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) {
if (TextUtils.isEmpty(asset))
return asset;
if ((!asset.endsWith(".ttf")) && (!asset.endsWith(".ttc")))
asset = String.format("%s.ttf", asset);
return asset;
}
}
ไฟล์นี้จะช่วยให้คุณใช้นามสกุลไฟล์. tc ได้ แต่ยังไม่ได้ทดสอบ
ประการที่สาม
สร้างคลาสใหม่ที่ TextView
subclasses ตัวอย่างนี้โดยเฉพาะอย่างยิ่งคำนึงถึงอักษร XML ที่กำหนดไว้ ( bold
, italic
ฯลฯ ) และนำไปใช้กับตัวอักษร (สมมติว่าคุณกำลังใช้ไฟล์ .ttc)
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));
}
}
}
}
สุดท้าย
แทนที่อินสแตนซ์ของTextView
ใน XML ของคุณด้วยชื่อคลาสแบบเต็ม ประกาศเนมสเปซที่กำหนดเองของคุณเช่นเดียวกับเนมสเปซ Android โปรดทราบว่า "typefaceAsset" ควรชี้ไปที่ไฟล์. ttf หรือ. tc ที่อยู่ในไดเร็กทอรี / assets ของคุณ
<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>