2012-09-05 39 views
25

可能重複:
Is it possible to set font for entire Application?Android的 - 如何設置自定義字體爲整個應用程序

我需要設置一個自定義的字體(.ttf格式)整個應用程序,怎麼能我做到了嗎? 從清單或XML將是最好的選擇,如果有可能

+0

僅僅因爲它被標記爲重複,不能提供更好的答案:使用書法庫來實現這一點。它甚至改變吐司的字體。 – suku

+0

查看此tut http://www.gadgetsaint.com/android/custom-fonts-textview-edittext-android/#.WNive2996Hs – ASP

+0

難道你只是使用https://github.com/chrisjenx/Calligraphy – Fattie

回答

22

編輯2014年9月:

對於任何人仍然看到這個老可怕的答案,真正的好答案就在這裏:

https://stackoverflow.com/a/16883281/1154026


OLD:

您最好的選擇是這樣的:

Customize Android Fonts

所以

TextView text = (TextView) findViewById(R.id.custom_font); 
    Typeface font = Typeface.createFromAsset(getAssets(), "yourfont.ttf"); 
    text.setTypeface(font); 

有了您的.ttf在「資產」文件夾的根目錄中。

+0

這個作品很好,但如果我有一個ListView如何更改該行的字體?我想可以通過XML來完成 –

+0

這個解決方案似乎不再適用於Android 5.0 任何其他選項? –

+0

@AndreaMarioLufino在你的適配器中設置這個字體到你得到的所有textViews都可以工作。假設你有'textview1,textview2'和'textView3',那麼你應該只對它們使用setTypface(yourfont)。希望能幫助到你。 – Recomer

7
TextView tv=(TextView)findViewById(R.id.custom); 
    Typeface face=Typeface.createFromAsset(getAssets(), 
              "fonts/Verdana.ttf"); 

    tv.setTypeface(face); 

把字體文件在/ RES fonts文件夾/

就像我的回答如果是有幫助...

9

創造學習一個TextView子類,在任何地方使用它

public class RobotoTextView extends TextView { 

    public RobotoTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public RobotoTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public RobotoTextView(Context context) { 
     super(context); 
     init(); 
    } 

    private void init() { 
     if (!isInEditMode()) { 
      Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/Roboto-Light.ttf"); 
      setTypeface(tf); 
     } 
    } 

} 

使用

<com.test.RobotoTextView 
     android:id="@+id/name" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     /> 

在Java代碼中,你可以將它轉換到TextView的

0

可以擴展的TextView的建議here,並設置你的字體,然後在整個應用程序中使用它。

11

你可以這樣做。 創建自定義的TextView和使用,一處處

public class MyTextView extends android.widget.TextView 
{ 

    public MyTextView(Context context) 
    { 
     this(context, null); 
    } 

    public MyTextView(Context context, AttributeSet attrs) 
    { 
     this(context, attrs, 0); 
    } 

    public MyTextView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs); 
     if (this.isInEditMode()) return ; 

     final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SomeStyle); 
     final String customFont = a.getString(R.styleable.SomeStyle_font); 

     //Build a custom typeface-cache here! 
     this.setTypeface(
      Typeface.createFromAsset(context.getAssets(), customFont) 
     ); 
    } 
} 

添加這attrs.xml

<declare-styleable name="SomeStyle"> 
    <attr name="font" format="string" /> 
</declare-styleable> 

然後在你的主題,做到這一點: 這將確保所有的textviews將使用樣式MyTextView

<item name="android:textViewStyle">@style/MyTextView</item> 

現在我們可以使用這種風格的自定義屬性來定義您的自定義字體。

<style name="MyTextView" parent="@android:style/Widget.TextView"> 
    <item name="font">MyPathToFontInAssets.ttf</item> 
</style> 

因此,無論何時在項目中使用MyTextView,它都將具有您的自定義字體。

重要:字樣都沒有緩存,所以如果你打算使用此代碼,你也應該建立一個自定義的字體緩存,所以你可以重新使用自定義字體爲所有textviews。這將顯着加速應用程序!

更新:正如Amir所說,這幾乎與Custom fonts and XML layouts (Android)一樣,但我也使用android樣式自動在應用程序的所有文本視圖中使用它。

+0

嗨!它顯示錯誤在這行' @ style/MyTextView ** ** 需要'type'屬性**我現在要做什麼? – DroidLearner

+0

我通過添加'type =「string」來清除錯誤'' – DroidLearner

+0

_字體不會被緩存,所以如果您打算使用此代碼,您還應該構建自定義字體緩存_如何構建緩存? – DroidLearner

相關問題