在我的应用程序中,我需要对所有textview和edit-text字段使用helvetica字体。除了对每个textview使用settypeface方法之外,还有什么方法可以做到这一点吗?任何建议都会有很大的帮助。
提前致谢!
答案 0 :(得分:64)
我自己想通了。这是我使用的代码。我创建自定义TextView
,其自定义字体为默认字体。
public class MyTextView extends TextView {
public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyTextView(Context context) {
super(context);
init();
}
private void init() {
Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font/chiller.ttf");
setTypeface(tf ,1);
}
}
答案 1 :(得分:27)
在您的活动中,在您致电后立即
的setContentView(R.id.blahblah);
你应该运行一个方法来遍历整个小部件层次结构并处理字体替换,比如;
setContentView(R.id.blahblah);
Utils.overrideFonts(this, findViewById(android.R.id.content));
提到的“overrideFonts”方法应该是类似的东西;
public static void overrideFonts(final Context context, final View v) {
try {
if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {
View child = vg.getChildAt(i);
overrideFonts(context, child);
}
} else if (v instanceof TextView) {
((TextView)v).setTypeface(FONT_REGULAR);
}
} catch (Exception e) {
e.printStackTrace();
// ignore
}
}
在这个方案中,FONT_REGULAR应该安全地在某个地方初始化,你可能想要一个单例或其他方式来确保它被正确初始化...
private static void initializeFonts(final Context context) {
FONT_REGULAR = Typeface.createFromAsset(context.getAssets(), "fonts/myfont_medium.otf");
FONT_BOLD = Typeface.createFromAsset(context.getAssets(), "fonts/myfont_bold.otf");
}
如果您使用像MyAppActivity这样的Activity子类(扩展Activity),那么您不需要为这些自定义更改每个Activity类。相反,你可以切入它并覆盖这样的行为;
public class MyAppActivity extends Activity {
... ...
@Override
public void setContentView(final int layoutResID) {
super.setContentView(layoutResID);
Utils.overrideFonts(this, findViewById(android.R.id.content));
}
... ...
}
通过这种方式,您可以使用您的任何活动来获得共同的行为;
public class SettingsUI extends MyAppActivity {
... ...
}
我希望它有帮助...... 干杯!
答案 2 :(得分:9)
创建一个样式并使用它所有的文本属性。
<style name="CustomText">
<item name="android:typeface">YourFontName</item>
</style>
使用它:
<TextView style="@style/CustomText" />
以上是在所有活动中使用自定义字体进行自定义,您可以使用....
Typeface font = Typeface.createFromAsset(getAssets(), "CustomFontName.ttf");
txt.setTypeface(font);
试试这个。
答案 3 :(得分:6)
要在所有应用程序中应用自定义字体,只需创建以下活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FontManager.getInstance().initialize(this, R.xml.fonts);
setContentView(R.layout.main);
}
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
SimpleFactory factory = new SimpleFactory();
return factory.onCreateView(name, context, attrs);
}
其中FontManager这是一个类,它管理在/xml/fonts.xml和SimpleFactory中定义的所有字体,只是工厂创建视图并将自定义字体应用于每个视图的文本视图实例。
/xml/fonts.xml
<?xml version="1.0" encoding="utf-8"?>
<familyset>
<family>
<nameset>
<!--Font name-->
<name>HelveticaNeueLTStd</name>
</nameset>
<fileset>
<!--Font styles-->
<file style="normal">fonts/HelveticaNeueLTStd-LtCn.otf</file>
<file style="bold">fonts/HelveticaNeueLTStd-MdCn.otf</file>
<file style="italic">fonts/HelveticaNeueLTStd-LtCnO.otf</file>
<file style="bold_italic">fonts/HelveticaNeueLTStd-MdCnO.otf</file>
</fileset>
</family>
<family>
<!--There new font family can be added,
don't forget add font files into /assets/fonts directory and
put the name of the font into /values/string/font.xml-->
</family>
</familyset>
FontFactory - abastract类,只需将其扩展为创建自己的工厂
public abstract class FontFactory implements LayoutInflater.Factory{
public final String TAG = getClass().getSimpleName();
static final Class<?>[] mConstructorSignature = new Class[] {Context.class, AttributeSet.class};
final Object[] mConstructorArgs = new Object[2];
private static final String[] sClassPrefixList = {
"android.widget.",
"android.webkit."
};
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
if("ViewStub".equals(name) || "View".equals(name)){
return null;
}
View view = null;
Constructor<? extends View> constructor = null;
Class clazz = null;
if (view == null) {
if (-1 == name.indexOf('.')) {
for (String prefix : sClassPrefixList) {
clazz = getClazz(prefix, name);
if(clazz != null){
break;
}
}
} else {
clazz = getClazz("", name);
}
}
if (clazz == null) {
Log.d(TAG, "View can't be created " + name);
return null;
}
try {
constructor = clazz.getConstructor(mConstructorSignature);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
Object[] args = mConstructorArgs;
args[1] = attrs;
if(constructor == null){
return null;
}
try {
view = constructor.newInstance(context, attrs);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
if(view != null){
onFontApply(context, view);
}
return view;
}
public abstract void onFontApply(Context context, View view);
private Class getClazz(String prefix, String name){
Class clazz = null;
try {
clazz = Class.forName(prefix + name);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
return clazz;
}
}
}
FontManager - 只需将/xml/fonts.xml中定义的字体文件映射到/ assets目录中的字体文件,并按字体系列名称和字体样式返回TypeFace。
public void initialize(Context context, int resId) {
if(mFonts != null){
Log.d(TAG,"FontManager have already initialized");
return;
}
XmlResourceParser parser = null;
try {
parser = context.getResources().getXml(resId);
mFonts = new ArrayList<Font>();
String tag;
String fontStryleAttr = null;
int eventType = parser.getEventType();
Font font = null;
do {
tag = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if (tag.equals(TAG_FAMILY)) {
// one of the font-families.
font = new Font();
} else if (tag.equals(TAG_NAMESET)) {
// a list of font-family names supported.
font.families = new ArrayList<String>();
} else if (tag.equals(TAG_NAME)) {
isName = true;
} else if (tag.equals(TAG_FILESET)) {
// a list of files specifying the different styles.
font.styles = new ArrayList<FontStyle>();
} else if (tag.equals(TAG_FILE)) {
isFile = true;
fontStryleAttr = parser.getAttributeValue(null, ATTR_STYLE);
}
break;
case XmlPullParser.END_TAG:
if (tag.equals(TAG_FAMILY)) {
// add it to the list.
if (font != null) {
mFonts.add(font);
font = null;
}
} else if (tag.equals(TAG_NAME)) {
isName = false;
} else if (tag.equals(TAG_FILE)) {
isFile = false;
fontStryleAttr = null;
}
break;
case XmlPullParser.TEXT:
String text = parser.getText();
if (isName) {
// value is a name, add it to list of family-names.
if (font.families != null)
font.families.add(text);
} else if (isFile) {
// value is a file, add it to the proper kind.
FontStyle fontStyle = new FontStyle();
fontStyle.font = Typeface.createFromAsset(context.getAssets(), text);
String attr = parser.getAttributeValue(null, ATTR_STYLE);
if (fontStryleAttr.equals(STYLE_BOLD))
fontStyle.style = Typeface.BOLD;
else if (fontStryleAttr.equals(STYLE_ITALIC))
fontStyle.style = Typeface.ITALIC;
else if (fontStryleAttr.equals(STYLE_BOLD_ITALIC))
fontStyle.style = Typeface.BOLD_ITALIC;
else
fontStyle.style = Typeface.NORMAL;
font.styles.add(fontStyle);
}
}
eventType = parser.next();
} while (eventType != XmlPullParser.END_DOCUMENT);
} catch (XmlPullParserException e) {
throw new InflateException("Error inflating font XML", e);
} catch (IOException e) {
throw new InflateException("Error inflating font XML", e);
} finally {
if (parser != null)
parser.close();
}
}
public Typeface get(String family, int style) {
for (Font font: mFonts) {
for (String familyName : font.families) {
if (familyName.equals(family)) {
// if no style in specified, return normal style.
if (style == -1)
style = Typeface.NORMAL;
for (FontStyle fontStyle : font.styles) {
if (fontStyle.style == style)
return fontStyle.font;
}
}
}
}
return mDefaultFont;
}
了解更多代码和示例,只需查看here
答案 4 :(得分:0)
好的,你可以做到,但你本质上想做的是一种有点地图格式的字体图集(它必须以unicode顺序运行,它开始!“#$%'()x +, - ./)。该函数将做的是接受一个字符串并找出每个相应字母在atlas中的位置。
它不是太容易,但每个角色必须具有相同的长度和宽度,你可以有不同的长度,但这将更加困难。
答案 5 :(得分:0)
在项目中导入他们的.jar。在XML中使用它
<com.neopixl.pixlui.components.textview.TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"
pixlui:typeface="MyFont.ttf" />
不要忘记实施方案(xmlns:pixlui =“http://schemas.android.com/apk/com.neopixl.pixlui”)
答案 6 :(得分:0)
setContentView(R.layout.activity_main);
custfont(this, findViewById(android.R.id.content));
private void custfont(final Context context, View v)
{
try
{
if (v instanceof ViewGroup)
{
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++)
{
View child = vg.getChildAt(i);
overrideFonts(context, child);
}
}
else if (v instanceof TextView )
{
((TextView) v).setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/ostrichblack.ttf"));
}
}
catch (Exception e)
{
}
}
答案 7 :(得分:0)
import android.content.Context;
import android.graphics.Typeface;
/**
* Created by Sanjeev Kumar on 4/18/2017.
*/
public class FontManager {
public Context mContext;
public FontManager(Context context) {
this.mContext = context;
}
public Typeface getSquarkiFont() {
return Typeface.createFromAsset(mContext.getAssets(), "fonts/Squarki.ttf");
}
public Typeface getLazySpringDayFont() {
return Typeface.createFromAsset(mContext.getAssets(), "fonts/LazySpringDay.ttf");
}
}