2012-01-21 77 views
17

從一個應用程序,我發展的需要,我已經收到了,有許多文件,如FONTNAME正規,FONTNAME粗體FONTNAME,它特定字體。我需要在應用程序的所有文字視圖中使用它。首先,我認爲這是一件容易的事。查看SO,發現了一個非常漂亮的主題:here自定義字體和自定義的TextView在Android

所以首先我不喜歡:

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

而且叫我活動的onCreate期間此方法。我的應用程序中的每個textView都顯示該字體和男孩,我很高興能夠輕鬆離開。直到我進入一個需要一些文字瀏覽的屏幕Bold as Styleandroid:textStyle="bold")。然後我意識到這個解決方案不能爲我提供從資產中加載Font-Bold .ttf的可能性。

不是進一步望去,只見一個漂亮的自定義TextView的實施,在相同的SO問題:

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

    } 
    } 

這看起來甚至更好。我的問題是:如何在init()上檢測我的控件是否將樣式設置爲粗體,以便我可以分配請求的類型?

謝謝你的時間。

LE。

public class MyTextView extends TextView { 

    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_REGULAR); 
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_BOLD); 

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

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

    public MyTextView(Context context) { 
     super(context); 
    } 

    public void setTypeface(Typeface tf, int style) { 
     if (style == Typeface.BOLD) { 
      super.setTypeface(boldTypeface/*, -1*/); 
     } else { 
      super.setTypeface(normalTypeface/*, -1*/); 
     } 
    } 
} 

那麼如果我調試,應用程序進去setTypeFace,它似乎適用大膽的一個,但在我的佈局,我看不到任何變化:按照下面的例子,因爲我已經更新了我的班,不粗體。無論使用什麼字體,我的TextView都不會做任何更改,並且會使用默認的android字體進行顯示。我想知道爲什麼 ?

我已經在博客文章here on my blog上總結了一切,也許它會幫助別人。

+0

謝謝爲詳細的問題和闡述,以及偉大的博客文章!爲我完美工作。我也爲同樣的結果分類了Button。我唯一的問題是w.r.t.調用createFromAsset()_every_時間的效率。將字體加載一次並將它們存儲在Application類中,並從MyTextView.setTypeface()訪問這些字體會更好嗎? –

+0

謝謝你的話。我也想過,但沒有測試看它是如何工作的。它應該工作正常。無論如何,我還沒有看到在屏幕上有許多意見的任何懲罰。 – Alin

回答

24

TextView的構造函數調用setTypeface(Typeface tf, int style),其中style參數從XML屬性android:textStyle中檢索。所以,如果你想截獲此調用,迫使自己的字體,你可以重寫此方法如下:

public void setTypeface(Typeface tf, int style) { 
    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_normal_font.ttf"); 
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_bold_font.ttf"); 

    if (style == Typeface.BOLD) { 
     super.setTypeface(boldTypeface/*, -1*/); 
    } else { 
     super.setTypeface(normalTypeface/*, -1*/); 
    } 
} 
+0

你的解決方案看起來是正確的,但它不起作用.... – Alin

+2

@Alin:問題是''setTypeface()'在創建'字體'之前被構造函數調用!所以,在'setTypeface()'裏面移動'Typeface'的創建,現在它就可以工作了! –

+0

現在,它的工作,謝謝。你已經度過了我的一天。 – Alin

9

你可以用我CustomTextView它允許你在你的assets文件夾指定字體文件名:

https://github.com/mafshin/CustomTextView

和使用是非常簡單的:

<com.my.app.CustomTextView 
     xmlns:custom="http://schemas.android.com/apk/res/com.my.app"    
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Test text" 
     android:id="@+id/testcustomview" 

     custom:fontAssetName="Politica XT.otf" 
     /> 
2

我覺得這是更好地創造Ë自己的包自定義字體,並將其導入您的項目,這樣就可以在未來

package com.codeslips.utilities; 

    import android.content.Context; 
    import android.graphics.Typeface; 
    import android.util.AttributeSet; 
    import android.widget.TextView; 

    public class CustomTextView extends TextView { 

      public CustomTextView(Context context) 
       { super(context); setFont(); } 

      public CustomTextView(Context context,AttributeSet set) 
      { super(context,set); setFont(); } 

      public CustomTextView(Context context,AttributeSet set,int defaultStyle) 
      { super(context,set,defaultStyle); setFont(); } 

      private void setFont() { 

      Typeface typeface=Typeface.createFromAsset(getContext().getAssets(),"fonts/your-font.ttf"); 
      setTypeface(typeface); //function used to set font 

      } 
      } 

在以後使用它們現在使用上面的類在XML文件中有您的自定義字體

<com.codeslips.utilities.CustomTextView 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:text="Upload Image" 
     android:paddingTop="10sp" 
     android:textSize="14sp" 
     android:layout_weight="0.7" 
     android:textColor="@android:color/white"/>