2016-02-05 76 views
5

我正嘗試更改我的應用中的默認字體。但它不工作。這些是我已經採取步驟:)無法更改Android應用中的默認字體

1)類創建TypefaceUtil.java

import android.content.Context; 
import android.graphics.Typeface; 
import android.util.Log; 

import java.lang.reflect.Field; 

public class TypefaceUtil { 

public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) { 
    try { 
     final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets); 

     final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride); 
     defaultFontTypefaceField.setAccessible(true); 
     defaultFontTypefaceField.set(null, customFontTypeface); 
    } catch (Exception e) { 
     Log.e("CustomFontException", "Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride); 
    } 
    } 
} 

2在延伸應用一類:

public void onCreate() { 

    super.onCreate(); 
    TypefaceUtil.overrideFont(getApplicationContext(), "MONOSPACE", "fonts/varelaround_regular.ttf"); 
} 

3)在樣式。 xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <item name="android:typeface">monospace</item> 
</style> 

仍然沒有工作。我錯過了什麼嗎?

+0

奇怪的是,我使用了相同的代碼,它對我來說工作得很好。唯一的區別是我使用'serif'而不是'monospace'。 –

回答

2

我曾經遇到過這個問題。我不確定它爲什麼可行,但您可以嘗試以下操作: 而不是「等寬」,請嘗試以下各項: DEFAULT,SANS_SERIF,SERIF。它可能不適用於所有textview,如ListView或recyclerView中的那些(奇怪,對吧?)。但在這些情況下,我從適配器編程設置字體。 抱歉無法解釋原因。

+0

感謝它,工作。 – SimenNash

1

爲此,我強烈建議您使用Calligraphy,https://github.com/chrisjenx/Calligraphy,這是一個非常棒的庫,真正向前邁進,用它來改變默認字體,還有很多其他有用的功能。

您需要設置的所有內容應該在自述文件中。

0

爲什麼不定義自定義TextView併爲其分配任何字體。從資產在你的實用工具類的哈希地圖

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

import com.exmple.util.Utility; 

public class CustomFontEditText extends EditText { 

    private Context mContext; 

    private String ttfName; 

    String TAG = getClass().getName(); 

    public CustomFontEditText(Context context) { 
     super(context); 
     this.mContext = context; 
    } 

    public CustomFontEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     this.mContext = context; 

     // Typeface.createFromAsset doesn't work in the layout editor. 
     // Skipping... 
     if (isInEditMode()) { 
      return; 
     } 

     for (int i = 0; i < attrs.getAttributeCount(); i++) { 
      this.ttfName = attrs.getAttributeValue(Utility.ATTRIBUTE_SCHEMA, 
        Utility.ATTRIBUTE_TTF_KEY); 

      if (null != ttfName) 
       init(); 
     } 

    } 

    public CustomFontEditText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     this.mContext = context; 
    } 

    private void init() { 
     Typeface font = Utility.getFonts(mContext, ttfName); 
     if (null != font) 
      setTypeface(font); 
    } 

    @Override 
    public void setTypeface(Typeface tf) { 

     super.setTypeface(tf); 
    } 

} 

加載和存儲字體,以便以後可以重用的字體。想象一下,每次新視圖加載時加載字體.. OOM .. !!!

private static Map<String, Typeface> TYPEFACE = new HashMap<String, Typeface>(); 
public static Typeface getFonts(Context context, String fontName) { 
    Typeface typeface = TYPEFACE.get(fontName); 
    if (typeface == null) { 
     typeface = Typeface.createFromAsset(context.getAssets(), "fonts/"+fontName); 
     TYPEFACE.put(fontName, typeface); 
    } 
    return typeface; 
} 

添加TTF屬性從XML

public static final String ATTRIBUTE_TTF_KEY = "ttf_name"; 

public static final String ATTRIBUTE_SCHEMA = "http://schemas.android.com/apk/lib/com.exmaple.ui.customfont"; 

設置字體現在在佈局文件中使用

<com.example.ui.customviews.CustomFontEditText 
      xmlns:font="http://schemas.android.com/apk/lib/com.exmaple.ui.customfont" 
      android:id="@+id/edt_pay_input" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="20dp" 
      android:background="@null" 
      android:cursorVisible="false" 
      android:drawableBottom="@drawable/dashed_white" 
      android:includeFontPadding="false" 
      android:inputType="numberDecimal" 
      android:maxLength="4" 
      android:minWidth="20dp" 
      android:singleLine="true" 
      android:textColor="@color/white" 
      android:textSize="30sp" 

      font:ttf_name="FedraSansStd-Light.otf" > 

      <requestFocus /> 
     </com.example.ui.customviews.CustomFontEditText> 

您可以爲按鈕做同樣的,TextView的等