Добавить пользовательский шрифт для полного приложения для Android
В моем приложении мне нужно использовать шрифт helvetica для всех полей textviews и edit-text. Есть ли способ сделать это иначе, чем использовать метод settypeface для каждого текстового поля? Любое предложение было бы большой помощью.
Спасибо заранее!
Ответы
Ответ 1
Я понял это сам. Это код, который я использовал. Я создаю пользовательский 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();
}
public void init() {
Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font/chiller.ttf");
setTypeface(tf ,1);
}
}
Ответ 2
В ваших действиях сразу после вызова
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");
}
Если вы используете подкласс Activity, такой как MyAppActivity (extends 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 {
... ...
}
Я надеюсь, что это поможет...
Ура!
Ответ 3
создать стиль и использовать все текстовые атрибуты.
<style name="CustomText">
<item name="android:typeface">YourFontName</item>
</style>
Используйте его:
<TextView style="@style/CustomText" />
Выше - использовать пользовательские шрифты во всех действиях для настройки, которые вы можете использовать....
Typeface font = Typeface.createFromAsset(getAssets(), "CustomFontName.ttf");
txt.setTypeface(font);
Попробуйте это.
Ответ 4
Чтобы применить пользовательский шрифт во всем приложении, просто создайте следующую активность:
@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 это класс, который управляет всеми Fonts, которые определены в /xml/fonts.xml и SimpleFactory, просто factory, которые создают представления и применяют собственный шрифт для каждого представления этого экземпляра текстового представления.
/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, просто расширяет его, чтобы создать свой собственный factory
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;
}
для большего количества кода и образцов просто посмотрите здесь
Ответ 5
Хорошо, вы можете это сделать, но то, что вы на самом деле хотите сделать, это атлас шрифта в виде своего формата (он должен будет запускаться в порядке юникода, который начинается! "# $% '() x +, -./). То, что функция будет делать, это взять строку и выяснить, где в атласе каждая соответствующая буква.
Не слишком легко, но каждый символ должен иметь одинаковую длину и ширину, вы можете иметь разную длину, но это будет намного сложнее.
Ответ 6
Вы можете использовать PixlUI в http://bit.ly/1bzjWQn
импортируйте их .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" )
Ответ 7
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)
{
}
}
Ответ 8
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");
}
}