2016-02-16 35 views
1

使用以下代碼覆蓋應用程序中的字體,但ActionBar和Buttons忽略它。其餘的(TextViews和EditTexts工作正常)。我正在使用AppCompat庫。提前感謝您的幫助。按鈕和ActionBar忽略應用程序中定義的自定義字體

@Override 
public void onCreate() { 

    super.onCreate(); 
    final Typeface regular = Typeface.createFromAsset(getAssets(),"fonts/avenir.ttc"); 
    replaceFont(Typeface.defaultFromStyle(R.style.AppTheme).toString(), regular); 
    replaceFont("DEFAULT", regular); 
} 
protected static void replaceFont(String staticTypefaceFieldName, 
            final Typeface newTypeface) { 
    if (Build.VERSION.SDK_INT >= 21) { 
     Map<String, Typeface> newMap = new HashMap<String, Typeface>(); 
     newMap.put("sans-serif", newTypeface); 

     try { 
      final Field staticField = Typeface.class 
        .getDeclaredField("sSystemFontMap"); 
      staticField.setAccessible(true); 
      staticField.set(null, newMap); 



      Field sDefaults = Typeface.class.getDeclaredField("sDefaults"); 
      sDefaults.setAccessible(true); 
      sDefaults.set(null, new Typeface[]{ 
        newTypeface, newTypeface, newTypeface, newTypeface 
      }); 

     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     try { 
      final Field staticField = Typeface.class 
        .getDeclaredField(staticTypefaceFieldName); 
      staticField.setAccessible(true); 
      staticField.set(null, newTypeface); 
     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

將是巨大的,如果有人解釋它是如何工作的。 (我猜問題是Buttons和ActionBar不會繼承某些類,字體被覆蓋)。謝謝。 – Kan

回答

0

嘗試使用這個類,我發現它在堆棧溢出本身。

public class TypefaceSpan extends MetricAffectingSpan { 
     /** An <code>LruCache</code> for previously loaded typefaces. */ 
    private static LruCache<String, Typeface> sTypefaceCache = 
      new LruCache<String, Typeface>(12); 

    private Typeface mTypeface; 

    /** 
    * Load the {@link Typeface} and apply to a {@link Spannable}. 
    */ 
    public TypefaceSpan(Context context, String typefaceName) { 
     mTypeface = sTypefaceCache.get(typefaceName); 

     if (mTypeface == null) { 
      mTypeface = Typeface.createFromAsset(context.getApplicationContext() 
        .getAssets(), String.format("fonts/%s", typefaceName)); 

      // Cache the loaded Typeface 
      sTypefaceCache.put(typefaceName, mTypeface); 
     } 
    } 

    @Override 
    public void updateMeasureState(TextPaint p) { 
     p.setTypeface(mTypeface); 

     // Note: This flag is required for proper typeface rendering 
     p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG); 
    } 

    @Override 
    public void updateDrawState(TextPaint tp) { 
     tp.setTypeface(mTypeface); 

     // Note: This flag is required for proper typeface rendering 
     tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG); 
    } 
} 

有關使用此

SpannableString s = new SpannableString("My Title"); 
s.setSpan(new TypefaceSpan(this, "MyTypeface.otf"), 0, s.length(), 
     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

// Update the action bar title with the TypefaceSpan instance 
ActionBar actionBar = getActionBar(); 
actionBar.setTitle(s); 

我不知道它是否會爲按鈕的工作試試吧:)

+1

感謝您的回覆,但我確實在尋找能讓我一次覆蓋所有內容的解決方案。我希望,谷歌有一些東西。 (這是一件常見的事情,他們真的使它變得複雜) – Kan

相關問題