Cómo configurar una fuente en particular para un texto de botón en android?

Deseo que mi texto del botón esté en la fuente de la luz gótica de Copperplate y todavía no he encontrado un código limpio simple para una función simple como esto. ¡Ayuda!

PS: Ya que android viene con ariel y algunas otras fuentes por sí solo necesitamos importar (disculpas por la falta de una palabra mejor ya que soy nuevo en esto) la fuente que queremos usar. Esto es todo lo que he podido reunir hasta ahora y esto es donde el sendero termina para mí.

7 Solutions collect form web for “Cómo configurar una fuente en particular para un texto de botón en android?”

Si planea agregar la misma fuente a varios botones, sugiero que vaya todo el camino y lo implemente como un botón de estilo y subclase:

public class ButtonPlus extends Button { public ButtonPlus(Context context) { super(context); } public ButtonPlus(Context context, AttributeSet attrs) { super(context, attrs); CustomFontHelper.setCustomFont(this, context, attrs); } public ButtonPlus(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); CustomFontHelper.setCustomFont(this, context, attrs); } } 

Esta es una clase de ayuda para establecer una fuente en un TextView (recuerde, Button es una subclase de TextView) basada en el atributo com.my.package: font:

 public class CustomFontHelper { /** * Sets a font on a textview based on the custom com.my.package:font attribute * If the custom font attribute isn't found in the attributes nothing happens * @param textview * @param context * @param attrs */ public static void setCustomFont(TextView textview, Context context, AttributeSet attrs) { TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomFont); String font = a.getString(R.styleable.CustomFont_font); setCustomFont(textview, font, context); a.recycle(); } /** * Sets a font on a textview * @param textview * @param font * @param context */ public static void setCustomFont(TextView textview, String font, Context context) { if(font == null) { return; } Typeface tf = FontCache.get(font, context); if(tf != null) { textview.setTypeface(tf); } } } 

Y aquí está el FontCache para reducir el uso de memoria en dispositivos antiguos :

 public class FontCache { private static Hashtable<String, Typeface> fontCache = new Hashtable<String, Typeface>(); public static Typeface get(String name, Context context) { Typeface tf = fontCache.get(name); if(tf == null) { try { tf = Typeface.createFromAsset(context.getAssets(), name); } catch (Exception e) { return null; } fontCache.put(name, tf); } return tf; } } 

En res / values ​​/ attrs.xml definimos el atributo personalizable de estilo

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CustomFont"> <attr name="font" format="string"/> </declare-styleable> </resources> 

Y finalmente un ejemplo de uso en un diseño:

  <com.my.package.buttons.ButtonPlus style="@style/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_sometext"/> 

Y en res / values ​​/ style.xml

 <style name="button" parent="@android:style/Widget.Button"> <item name="com.my.package:font">fonts/copperplate_gothic_light.TTF</item> </style> 

Esto puede parecer una gran cantidad de trabajo, pero me agradecerá una vez que tenga par de puñados de botones y campos de texto en los que desee cambiar la fuente.

1) Obtenga la fuente que necesita como archivo .ttf (CopperplateGothicLight.ttf por ejemplo) y colóquela en el directorio / assets / de su proyecto

2) Utilice este código para referirse a la fuente y establecerlo en su botón:

 Typeface copperplateGothicLight = Typeface.createFromAsset(getAppContext().getAssets(), "CopperplateGothicLight.ttf"); yourButton.setTypeface(copperplateGothicLight); 

Después de varias investigaciones, mi mejor opción fue:

 public class CustomButton extends Button { Typeface normalTypeface = FontCache.get("fonts/CopperplateGothicLight.ttf", getContext()); Typeface boldTypeface = FontCache.get("fonts/CopperplateGothicBold.ttf", getContext()); /** * @param context */ public CustomButton(Context context) { super(context); } /** * @param context * @param attrs */ public CustomButton(Context context, AttributeSet attrs) { super(context, attrs); } /** * @param context * @param attrs * @param defStyleAttr */ public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } } 

Entonces Usando fontCache de la primera respuesta en esto: La memoria se filtra con la fuente de encargo para la fuente de encargo del sistema

 public class FontCache { private static Hashtable<String, Typeface> fontCache = new Hashtable<String, Typeface>(); public static Typeface get(String name, Context context) { Typeface tf = fontCache.get(name); if(tf == null) { try { tf = Typeface.createFromAsset(context.getAssets(), name); } catch (Exception e) { return null; } fontCache.put(name, tf); } return tf; } } 

Menos código y más uso de los estándares de Android!

MainActivity.java

  package com.mehuljoisar.customfontdemo; import android.app.Activity; import android.graphics.Typeface; import android.os.Bundle; import android.view.Menu; import android.widget.Button; public class MainActivity extends Activity { private Button button1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button)findViewById(R.id.button1); button1.setTypeface(Typeface.createFromAsset(getAssets(), "copperplate-gothic-light.ttf")); button1.setText("hello"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } 

Activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginTop="24dp" android:text="Button" /> 

Enlace de descarga para la fuente deseada: copperplate_gothic_light

Póngalo dentro de su carpeta de activos.

Captura de pantalla: Introduzca aquí la descripción de la imagen

Espero que sea util !!

Primero descargue el archivo TTF para el estilo de fuente y luego póngalo en la carpeta de assets de su proyecto.

Puede configurarlo de forma programática de la siguiente manera:

 Typeface font_style = Typeface.createFromAsset(getAssets(), "yourcystomfontstyle.ttf"); yourbutton.setTypeface(font_style); 

Puede utilizar la clase de botón personalizado como se indica a continuación. Coloque su fuente en la carpeta de recurso / fuente.

 public class CustomButton extends Button{ public CustomButton(Context context, AttributeSet attrs) { super(context, attrs); init(); // TODO Auto-generated constructor stub } public CustomButton(Context context) { super(context); init(); // TODO Auto-generated constructor stub } public CustomButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); // TODO Auto-generated constructor stub } private void init(){ Typeface font_type=Typeface.createFromAsset(getContext().getAssets(), "font/ProximaNova-Bold.ttf"); setTypeface(font_type); } } 

Ahora puede utilizar el botón en xml como se indica a continuación.

 <model.CustomButton android:id="@+id/search" android:layout_width="@dimen/edittext_width_large" android:layout_height="@dimen/button_height" android:layout_below="@+id/cars" android:layout_centerHorizontal="true" android:layout_marginTop="@dimen/pad_20dp" android:background="@drawable/button_pressed_bg" android:text="@string/find_car" android:textColor="@color/white" /> 

Prueba esto. También es útil para EditTextViews, TextViews .. lo que sea!

 <your.namespace.app.FontButton app:font="montserrat" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

¿Quién es posible? ¡Por esta manera!

 public class FontButton extends Button { public FontEditText(Context context) { this( context, null ); } public FontEditText(Context context, AttributeSet attrs) { this( context, attrs, 0 ); init( context, attrs ); } public FontEditText(Context context, AttributeSet attrs, int defStyle) { super( context, attrs, defStyle ); init( context, attrs ); } public FontEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super( context, attrs, defStyleAttr, defStyleRes ); init( context, attrs ); } private void init(Context context, AttributeSet attrs) { TypedArray ta = context.obtainStyledAttributes( attrs, R.styleable.Fonts ); if ( ta != null ) { String fontAsset = ta.getString( R.styleable.Fonts_font ); if ( !StringUtils.isEmpty( fontAsset ) ) { int type = Integer.parseInt( fontAsset ); Typeface typeFace = FontManager.getInstance( context ).getByType( type ); ta.recycle(); super.setTypeface( typeFace ); } } } } public class FontManager { private static FontManager Instance; private Context context; private Typeface robotoCondensedBold; private Typeface robotoCondensed; private Typeface robotoLight; private Typeface kronica; private Typeface montserrat; private Typeface montserratLight; private Typeface keepCalmMedium; private FontManager(Context context) { this.context = context; this.robotoCondensedBold = Typeface.createFromAsset( context.getAssets(), "fonts/RobotoCondensed-Bold.ttf" ); this.robotoCondensed = Typeface.createFromAsset( context.getAssets(), "fonts/RobotoCondensed-Regular.ttf" ); this.robotoLight = Typeface.createFromAsset( context.getAssets(), "fonts/Roboto-Light.ttf" ); this.kronica = Typeface.createFromAsset( context.getAssets(), "fonts/kronika.ttf" ); this.montserrat = Typeface.createFromAsset( context.getAssets(), "fonts/Montserrat-Regular.ttf" ); this.montserratLight = Typeface.createFromAsset( context.getAssets(), "fonts/Montserrat-Light.ttf" ); this.keepCalmMedium = Typeface.createFromAsset( context.getAssets(), "fonts/KeepCalmMedium.ttf" ); } public synchronized static FontManager getInstance(Context context) { if ( Instance == null ) Instance = new FontManager( context ); return Instance; } public Typeface getByType(int type) { switch ( type ) { case 0: return FontManager.getInstance( context ).getRobotoCondensedBold(); case 1: return FontManager.getInstance( context ).getRobotoLight(); case 2: return FontManager.getInstance( context ).getKronica(); case 3: return FontManager.getInstance( context ).getRobotoCondensed(); case 4: return FontManager.getInstance( context ).getMontserrat(); case 5: return FontManager.getInstance( context ).getMontserratLight(); case 6: return FontManager.getInstance( context ).getKeepCalmMedium(); default: return Typeface.DEFAULT; } } public Typeface getRobotoCondensedBold() { return robotoCondensedBold; } public Typeface getKronica() { return kronica; } public Typeface getRobotoCondensed() { return robotoCondensed; } public Typeface getRobotoLight() { return robotoLight; } public Typeface getMontserrat() { return montserrat; } public Typeface getMontserratLight() { return montserratLight; } public Typeface getKeepCalmMedium() { return keepCalmMedium; } 

Además, un font_attrs.xml en su carpeta res :

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="Fonts"> <attr name="font" format="enum"> <enum name="robotoCondensedBold" value="0"/> <enum name="robotoLight" value="1"/> <enum name="kronica" value="2"/> <enum name="robotoCondensed" value="3"/> <enum name="montserrat" value="4"/> <enum name="montserratLight" value="5"/> <enum name="keepCalmMedium" value="6"/> </attr> </declare-styleable> </resources> 

Tenga en cuenta que sólo necesita modificar el FontManager y el font_attrs.xml para personalizar sus fuentes!

  • Cómo resuelve la forma redonda rect demasiado grande para ser representada en una textura en android TextBox
  • Metaio sdk (openGL) frena la representación de fuente y de imagen
  • Cómo obtener la altura y el ancho de un texto con Canvas
  • Cómo dibujar con una fuente predeterminada de Android en una lona?
  • Canvas.drawText (...) no imprime linebreak
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.