如何在android中为button文本设置特定的字体?

我想我的button文本是在铜版哥特式灯光字体,我还没有遇到一个简单的干净的代码为一个简单的function。 帮帮我!

PS:由于android自带了ariel和一些其他的字体,所以我们需要导入 (因为我还没有更好的词,因此我们希望使用这个字体)。 这是我一直能够收集到的所有事情,而这正是我所走过的地方。

如果您打算将相同的字体添加到几个button,我build议您一路去实现它作为样式和子类button:

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

这是一个辅助类,用于在TextView上设置字体(请记住,Button是TextView的一个子类),它基于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); } } } 

这里是FontCache,以减less旧设备上的内存使用情况 :

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

在res / values / attrs.xml中,我们定义了自定义样式属性

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

最后一个例子在布局中使用:

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

并在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> 

这可能看起来像很多工作,但是如果您想要更改字体的几个button和文本字段,您会感谢我。

1)获取您需要的字体作为.ttf(例如CopperplateGothicLight.ttf)文件,并将其放在项目的/ assets /目录中

2)使用此代码来引用字体并将其设置为您的button:

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

经过多次研究,我最好的select是:

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

然后从第一个答案使用fontCache: 内存泄漏用自定义字体设置自定义字体

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

更less的代码和更多的使用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" /> 

下载所需字体的链接: copperplate_gothic_light

把它放在你的资产文件夹。

截图: 在这里输入图像描述

我希望它会有帮助!

首先下载字体样式的TTF文件,然后将其放到项目的assets文件夹中。

您可以通过以下方式以编程方式进行设置:

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

你可以使用下面给出的自定义button类。把你的字体放在资产/字体文件夹中。

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

现在,您可以使用xml中的button,如下所示。

 <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" /> 

尝试这个。 也适用于EditTextViews,TextViews ..什么!

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

谁有可能? 就这样!

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

另外,你的res文件夹中有一个font_attrs.xml文件:

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

请注意,您只需要修改FontManagerfont_attrs.xml来自定义您的字体!