一、
1、通过反射来获取系统字体并替换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import
java.lang.reflect.Field;
import
android.content.Context;
import
android.graphics.Typeface;
public
final
class
FontsOverride {
public
static
void
setDefaultFont(Context context,
String staticTypefaceFieldName, String fontAssetName) {
final
Typeface regular = Typeface.createFromAsset(context.getAssets(),
fontAssetName);
replaceFont(staticTypefaceFieldName, regular);
}
protected
static
void
replaceFont(String staticTypefaceFieldName,
final
Typeface newTypeface) {
try
{
final
Field staticField = Typeface.
class
.getDeclaredField(staticTypefaceFieldName);
staticField.setAccessible(
true
);
staticField.set(
null
, newTypeface);
}
catch
(NoSuchFieldException e) {
e.printStackTrace();
}
catch
(IllegalAccessException e) {
e.printStackTrace();
}
}
}
|
2、在Application类中执行修改字体(替换系统默认字体)
1
2
3
4
5
6
7
8
9
10
|
public
final
class
Application
extends
android.app.Application {
@Override
public
void
onCreate() {
super
.onCreate();
FontsOverride.setDefaultFont(
this
,
"DEFAULT"
,
"MyFontAsset.ttf"
);
FontsOverride.setDefaultFont(
this
,
"MONOSPACE"
,
"MyFontAsset2.ttf"
);
FontsOverride.setDefaultFont(
this
,
"SERIF"
,
"MyFontAsset3.ttf"
);
FontsOverride.setDefaultFont(
this
,
"SANS_SERIF"
,
"MyFontAsset4.ttf"
);
}
}
|
二、
配置文件AndroidManifest.xml中修改(只限系统theme中已有字体)
1
2
3
|
<style name=
"AppTheme"
parent=
"android:Theme.Holo.Light.DarkActionBar"
>
<item name=
"android:typeface"
>monospace</item>
</style>
|
三、遍历viewGroup下所有文本控件并设置字体
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/**
* Recursively sets a {@link Typeface} to all
* {@link TextView}s in a {@link ViewGroup}.
*/
public
static
final
void
setAppFont(ViewGroup mContainer, Typeface mFont,
boolean
reflect)
{
if
(mContainer ==
null
|| mFont ==
null
)
return
;
final
int
mCount = mContainer.getChildCount();
// Loop through all of the children.
for
(
int
i =
0
; i < mCount; ++i)
{
final
View mChild = mContainer.getChildAt(i);
if
(mChild
instanceof
TextView)
{
// Set the font if it is a TextView.
((TextView) mChild).setTypeface(mFont);
}
else
if
(mChild
instanceof
ViewGroup)
{
// Recursively attempt another ViewGroup.
setAppFont((ViewGroup) mChild, mFont);
}
else
if
(reflect)
{
try
{
Method mSetTypeface = mChild.getClass().getMethod(
"setTypeface"
, Typeface.
class
);
mSetTypeface.invoke(mChild, mFont);
}
catch
(Exception e) {
/* Do something... */
}
}
}
}
|
1
2
3
4
5
|
final
Typeface mFont = Typeface.createFromAsset(getAssets(),
"fonts/MyFont.ttf"
);
final
ViewGroup mContainer = (ViewGroup) findViewById(
android.R.id.content).getRootView();
HomeActivity.setAppFont(mContainer, mFont);
|
四、自定义控件并设置字体
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public
class
CusFntTextView
extends
TextView {
public
CusFntTextView(Context context, AttributeSet attrs,
int
defStyle) {
super
(context, attrs, defStyle);
init();
}
public
CusFntTextView(Context context, AttributeSet attrs) {
super
(context, attrs);
init();
}
public
CusFntTextView(Context context) {
super
(context);
init();
}
private
void
init() {
if
(!isInEditMode()) {
Typeface tf = Typeface.createFromAsset(getContext().getAssets(),
"Futura.ttf"
);
setTypeface(tf);
}
}
|
1
|
<com.packagename.cusfnttextview android:id=
"@+id/tvtitle"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Hi Android"
android:textappearance=
"?android:attr/textAppearanceLarge"
></com.packagename.cusfnttextview>
|