更改字体的方法:
public class FontsManager {
public static final String TAG = "FontsManagerException";
public static final String INIT_EXCEPTION = "FontsManager使用该函数前必须先进行初始化";
/** 默认字体 */
public static Typeface defaultTypeface = null;
private FontsManager(){}
//----初始化-------------------------------------------------------------------------
/**
* 初始化
*
* @Title: init
* @param typeface 字体
*/
public static void init(Typeface typeface){
if (typeface == null) {
Log.e(TAG, "typeface不能为空。");
throw new IllegalStateException("typeface不能为空。");
} else {
defaultTypeface = typeface;
}
}
/**
* 初始化
*
* @Title: initFormAssets
* @param context 上下文
* @param fontPath Assets中字体包路径
*/
public static void initFormAssets(Context context, String fontPath){
try {
defaultTypeface = Typeface.createFromAsset(context.getAssets(), fontPath);
} catch (Exception e) {
Log.e(TAG, "初始化失败,请检查fontsPath是否错误");
throw new IllegalStateException("初始化失败,请检查fontsPath是否错误");
}
}
/**
* 初始化
*
* @Title: initFormFile
* @param fontPath 字体包存放路径(例如:sdcard/font.ttf)
*/
public static void initFormFile(String fontPath){
try {
defaultTypeface = Typeface.createFromFile(fontPath);
} catch (Exception e) {
Log.e(TAG, "初始化失败,请检查fontsPath是否错误");
throw new IllegalStateException("初始化失败,请检查fontsPath是否错误");
}
}
/**
* 初始化
*
* @Title: initFormFile
* @param fontPath 字体包文件
*/
public static void initFormFile(File fontFile){
try {
defaultTypeface = Typeface.createFromFile(fontFile);
} catch (Exception e) {
Log.e(TAG, "初始化失败,请检查fontFile是否是字体文件");
throw new IllegalStateException("初始化失败,请检查fontFile是否是字体文件");
}
}
//----改变字体-------------------------------------------------------------------------
/**
* 更换字体
*
* @Title: changeFonts
* @param activity
*/
public static void changeFonts(Activity activity){
if (defaultTypeface == null) {
Log.e(TAG, INIT_EXCEPTION);
throw new IllegalStateException(INIT_EXCEPTION);
}
//此行代码注释后不看到有什么变化
// ActionBarHelper.changeTitleFonts(activity, defaultTypeface);
changeFonts((ViewGroup) activity.findViewById(android.R.id.content), defaultTypeface);
}
/**
* 更改字体
*
* @Title: changeFonts
* @param view
*/
public static void changeFonts(View view){
if (defaultTypeface == null) {
Log.e(TAG, INIT_EXCEPTION);
throw new IllegalStateException(INIT_EXCEPTION);
}
changeFonts(view, defaultTypeface);
}
/**
* 更改字体
*
* @Title: changeFonts
* @param viewGroup
*/
public static void changeFonts(ViewGroup viewGroup){
if (defaultTypeface == null) {
Log.e(TAG, INIT_EXCEPTION);
throw new IllegalStateException(INIT_EXCEPTION);
}
changeFonts(viewGroup, defaultTypeface);
}
/**
* 更换字体
*
* @Title: changeFonts
* @param viewGroup
* @param typeface
*/
public static void changeFonts(ViewGroup viewGroup, Typeface typeface){
try {
for (int i = 0; i < viewGroup.getChildCount(); i++) {
View v = viewGroup.getChildAt(i);
if (v instanceof ViewGroup) {
changeFonts((ViewGroup) v, typeface);
} else if (v instanceof View) {
changeFonts((View) v, typeface);
}
}
} catch (Exception e) {
Log.e(TAG, e.toString());
// TODO
}
}
/**
* 更换字体
*
* @Title: changeFonts
* @param view
* @param typeface void
*/
public static void changeFonts(View view, Typeface typeface){
try {
if (view instanceof ViewGroup) {
changeFonts((ViewGroup) view, typeface);
} else if (view instanceof TextView) {
((TextView) view).setTypeface(typeface);
} else if (view instanceof Button) {
((Button) view).setTypeface(typeface);
} else if (view instanceof Switch) {
((Switch) view).setTypeface(typeface);
} else if (view instanceof EditText) {
((EditText) view).setTypeface(typeface);
}
} catch (Exception e) {
Log.e(TAG, e.toString());
// TODO
}
}
}
View页,点击按钮更改字体,字体放在与java目录平级的assets目录下:
public class FontManageDemoActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_font_manage_demo);
FontsManager.initFormAssets(FontManageDemoActivity.this,"fonts/sao.ttf");
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FontsManager.changeFonts(FontManageDemoActivity.this);
Toast.makeText(FontManageDemoActivity.this,"替换成功",Toast.LENGTH_SHORT).show();
}
});
}
}
在网上查询到的资料中还有一个文件,但我使用后,没看到效果,该文件的调用在FontManager.java中的changeFonts(Activity activity)中:
@SuppressLint("DefaultLocale")
@SuppressWarnings("deprecation")
public class ActionBarHelper {
private static final String TAG = "ActionBarHelper";
public static final String INIT_EXCEPTION = "使用该函数前必须对FontsManager进行初始化";
/**
* 改变标题字体
*
* @Title: changeTitleFonts
* @param activity
* @param typeface
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static void changeTitleFonts(Activity activity, Typeface typeface){
if (typeface == null || activity == null) {
Log.e(TAG, "activity或 typeface等于空!");
return;
}
if (activity instanceof ActionBarActivity) {
try {
android.support.v7.app.ActionBar actionBar = ((ActionBarActivity) activity).getSupportActionBar();
setTitle(actionBar, typeface, actionBar.getTitle().toString());
} catch (Exception e) {
Log.e(TAG, e.toString());
}
} else if (activity instanceof Activity) {
try {
ActionBar actionBar = activity.getActionBar();
setTitle(actionBar, typeface, actionBar.getTitle().toString());
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static void setTitle(Activity activity, Typeface typeface, String title){
if (activity instanceof android.support.v7.app.ActionBarActivity) {
try {
android.support.v7.app.ActionBar actionBar = ((ActionBarActivity) activity).getSupportActionBar();
setTitle(actionBar, typeface, title);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
} else if (activity instanceof Activity) {
try {
ActionBar actionBar = activity.getActionBar();
setTitle(actionBar, typeface, title);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
}
public static void setTitle(android.support.v7.app.ActionBar actionBar, Typeface typeface, String title){
if (typeface == null || actionBar == null) {
Log.e(TAG, "typeface或actionbar为空");
return;
}
SpannableString sp = new SpannableString(title);
sp.setSpan(new TypefaceSpan(typeface), 0, sp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
setTitle(actionBar, sp);
}
public static void setTitle(ActionBar actionBar, Typeface typeface, String title){
if (typeface == null || actionBar == null) {
Log.e(TAG, "typeface或actionbar为空");
return;
}
SpannableString sp = new SpannableString(title);
sp.setSpan(new TypefaceSpan(typeface), 0, sp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
setTitle(actionBar, sp);
}
/**
* 设置标题
*
* @Title: setTitle
* @param actionBar
* @param spannableString
*/
public static void setTitle(android.support.v7.app.ActionBar actionBar, SpannableString spannableString){
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN && Build.MANUFACTURER.toUpperCase().equals("LGE")) {
actionBar.setTitle(spannableString.toString());
} else {
actionBar.setTitle(spannableString);
}
}
/**
* 设置标题
*
* @Title: setTitle
* @param actionBar
* @param spannableString
*/
@TargetApi(11)
public static void setTitle(ActionBar actionBar, SpannableString spannableString){
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN && Build.MANUFACTURER.toUpperCase().equals("LGE")) {
actionBar.setTitle(spannableString.toString());
} else {
actionBar.setTitle(spannableString);
}
}
/**
* 设置字体样式
*
* @ClassName: TypefaceSpan
* @author: sloop
* @website: http://www.sloop.icoc.cc
* @weibo: http://weibo.com/u/5459430586
* @date 2015年6月9日 下午12:11:13
*/
private static class TypefaceSpan extends MetricAffectingSpan {
Typeface typeface;
TypefaceSpan(Typeface typeface){
this.typeface = typeface;
}
@Override
public void updateMeasureState(TextPaint p){
p.setTypeface(typeface);
p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
}
@Override
public void updateDrawState(TextPaint tp){
tp.setTypeface(typeface);
tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
}
}
}