โปรดปฏิบัติตามการปรับแต่งพื้นฐานของ FontTextView, FontEditView, FontRadioButton, FontCheckBox และ FontButton
[สำหรับคำตอบที่แน่นอนหลังจากอ่านคู่มือนี้โปรดดู:
https://stackoverflow.com/a/51113022/787399 ]
ใช้ FontTextView แบบกำหนดเองในเค้าโครงรายการ ArrayAdapter ดังนี้:
public class FontEditText extends AppCompatEditText {
public FontEditText(Context context) {
super(context, null);
}
public FontEditText(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setFontFromAsset(context, attrs, R.attr.fetFontStyle);
}
public FontEditText(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setFontFromAsset(context, attrs, defStyleAttr);
}
private void setFontFromAsset(Context context, AttributeSet attrs, int defStyle) {
BaseActivity activity = (BaseActivity)((MyApplication) context.getApplicationContext()).getCurrentActivity();
FontAndLocaleManager fontAndLocaleManager = activity.getFontAndLocaleManager();
fontAndLocaleManager.setFontFromAsset(this, R.styleable.FontEditText, R.styleable.FontEditText_fetFontFace, attrs, defStyle);
}
}
ใช้รหัส:
public void setFontFromAsset(View view, int[] resViewStyleable, int resStyleableViewFontFace, AttributeSet attrs, int defStyle) {
String strFont = null;
Typeface tfFontFace = null;
String strButton = FontButton.class.getCanonicalName(),
strTextView = FontTextView.class.getCanonicalName(),
strEditText = FontEditText.class.getCanonicalName(),
strView = view.getClass().getCanonicalName();
try {
if (view.isInEditMode()) {
return;
}
strFont = context.getString(R.string.font_roboto_regular);
tfFontFace = Typeface.createFromAsset(context.getAssets(), strFont);
TypedArray a = context.obtainStyledAttributes(attrs, resViewStyleable, defStyle, 0);
String derivedFont = a.getString(resStyleableViewFontFace);
a.recycle();
try {
if (derivedFont != null) {
Typeface derivedFontFace = Typeface.createFromAsset(context.getAssets(), derivedFont);
if (strView.equals(strButton)) {
((FontButton) view).setTypeface(derivedFontFace);
} else if (strView.equals(strTextView)) {
((FontTextView) view).setTypeface(derivedFontFace);
} else if (strView.equals(strEditText)) {
((FontEditText) view).setTypeface(derivedFontFace);
}
return;
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (strFont != null && tfFontFace != null) {
if (strView.equals(strButton)) {
((FontButton) view).setTypeface(tfFontFace);
} else if (strView.equals(strTextView)) {
((FontTextView) view).setTypeface(tfFontFace);
} else if (strView.equals(strEditText)) {
((FontEditText) view).setTypeface(tfFontFace);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
อธิบายรูปแบบและคุณลักษณะใน xml ที่เกี่ยวข้อง:
<declare-styleable name="FontTextViewStyle">
<attr name="ftvFontStyle" format="reference"/>
</declare-styleable>
<declare-styleable name="FontTextView">
<attr name="ftvFontFace" format="reference"/>
</declare-styleable>
และ
<style name="StyledFontTextView" parent="@android:style/Theme.Light">
<item name="ftvFontStyle">@style/DefaultFontTextView</item>
</style>
<style name="DefaultFontTextView">
<item name="ftvFontFace">@string/font_roboto_regular</item>
</style>
กำหนดรูปแบบเพิ่มเติม:
<style name="App_TextViewStyle" parent="@android:style/Widget.TextView">
<item name="android:textColor">@color/text_grey</item>
<item name="android:textSize">@dimen/sp_20</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
</style>
<style name="App_TextViewStyleMedium" parent="@android:style/Widget.TextView">
<item name="android:textColor">@color/text_hint</item>
<item name="android:textSize">@dimen/sp_18</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
</style>
<style name="App_TextViewStyleSmall" parent="@android:style/Widget.TextView">
<item name="android:textColor">@color/text_grey_light</item>
<item name="android:textSize">@dimen/sp_14</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
</style>
พูดถึงแบบอักษรใน strings.xml ของคุณ:
...
<string name="font_roboto_regular">fonts/roboto_regular.ttf</string>
...
และใช้ในการจัดวางเพื่อประหยัดรหัสและเวลา:
<com.mypackage.custom_views.FontTextView
style="@style/App_TextViewStyleMedium"
android:layout_gravity="start|bottom"
android:gravity="start|bottom"
app:fetFontFace="@string/font_roboto_regular"
android:text="@string/are_you_a" />
ใน Android ระดับ 16 ขึ้นไปทั้งหมดนี้ง่ายขึ้นเพราะตอนนี้คุณสามารถเก็บ TTF และทรัพยากรแบบอักษรอื่น ๆ ไว้ใน/res/font
โฟลเดอร์แทนที่จะอยู่ในเนื้อหา ซึ่งจะลบคลาสสไตล์และแอตทริบิวต์ที่กำหนดเองส่วนใหญ่โปรดดู:
ทรัพยากรแบบอักษรใน Android
Happy Coding อย่างมีสไตล์ !! :-)