studio programacion para libros libro edición desarrollo con aplicaciones android textview custom-font

programacion - Agregue una fuente personalizada para la aplicación completa de Android



libros de android pdf (8)

En tus actividades, justo después de llamar

setContentView (R.id.blahblah);

debe ejecutar un método para revisar toda la jerarquía de widgets y ocuparse de la sustitución de fuentes, como;

setContentView(R.id.blahblah); Utils.overrideFonts(this, findViewById(android.R.id.content));

Y el método mencionado "overrideFonts" debería ser algo así como;

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 } }

En este esquema, FONT_REGULAR debe inicializarse en algún lugar de forma segura, es posible que desee un singleton o alguna otra forma para asegurarse de que se inicialice correctamente ...

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"); }

Si usa una subclase de actividad como MyAppActivity (amplía la actividad), entonces no necesita cambiar todas y cada una de las clases de actividad para tales personalizaciones. En cambio, puedes cortarlo y anular el comportamiento como tal;

public class MyAppActivity extends Activity { ... ... @Override public void setContentView(final int layoutResID) { super.setContentView(layoutResID); Utils.overrideFonts(this, findViewById(android.R.id.content)); } ... ... }

De esta forma puede usar cualquier actividad suya para tener un comportamiento común;

public class SettingsUI extends MyAppActivity { ... ... }

Espero que ayude ... ¡Salud!

En mi aplicación, necesito usar la fuente helvetica para todas las textviews y campos de edición de texto. ¿Hay alguna forma de hacer esto que no sea usar el método settypeface para cada vista de texto? Cualquier sugerencia sería de gran ayuda.

Gracias por adelantado !


Ok, puedes hacerlo pero lo que esencialmente quieres hacer es un atlas de fuentes en un formato de mapa (¡tendrá que ejecutarse en orden unicode, que comience! "# $% ''() X +, -. /). Lo que la función lo que haré es tomar una cuerda y averiguar en qué parte del atlas está cada letra correspondiente.

No es muy fácil, pero cada personaje debe tener la misma longitud y ancho, puedes tener diferentes longitudes pero será mucho más difícil.


Para aplicar una fuente personalizada en todas las aplicaciones, solo crea la siguiente actividad:

@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); }

donde FontManager es una clase que administra todas las fuentes que se definieron en /xml/fonts.xml y SimpleFactory de fábrica que crean vistas y aplican una fuente personalizada a cada vista de esa instancia de vista de texto.

/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 - clase abastract, solo lo extiende para crear tu propia fábrica

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: simplemente asigne los archivos de fuentes definidos en /xml/fonts.xml a los archivos de fuentes ubicados en el directorio / assets y devuelva TypeFace por nombre de fuente y estilo de fuente.

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; }

para obtener más código y ejemplos solo mira here


Puede usar PixlUI en http://bit.ly/1bzjWQn

importar su .jar en su proyecto. Úselo en 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" />

No olvide implementar el esquema (xmlns: pixlui = "http://schemas.android.com/apk/com.neopixl.pixlui")


crea un estilo y usa todos los atributos de texto.

<style name="CustomText"> <item name="android:typeface">YourFontName</item> </style>

Úselo:

<TextView style="@style/CustomText" />

Arriba está el uso de fuentes personalizadas en toda la actividad para la personalización que puede usar ....

Typeface font = Typeface.createFromAsset(getAssets(), "CustomFontName.ttf"); txt.setTypeface(font);

Prueba esto.


Lo descubrí por mi cuenta. Este es el código que utilicé Creo TextView personalizado que tiene una fuente personalizada como fuente predeterminada.

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); } }


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) { } }


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"); } }