帮酷LOGO
0 0 评论
文章标签:自定义字体  font  


Android不提供在應用程序的所有區域中使用定製字體文件(TTF,otf等)的機制,相反,必須使用策略在所有TextView,EditText和Button設置定製的Typeface 。

這篇文章涵蓋了應對常見應用需求的策略。

視圖爬蟲

Android中的布局(還有sub-layouts )是由ViewGroup作為複合元素,View為葉子節點的樹層次結構,可以通過在你喜歡的(廣度優先或深度優先)中訪問子視圖來抓取此樹,爬這棵樹的時候你可以在任何TextView上替換所有的,和所遇到的Button

下面是一個視圖爬蟲的簡單遞歸實現,它將替換層次結構中任何適當視圖的Typeface

public class FontChangeCrawler
{
 private Typeface typeface;

 public FontChangeCrawler(Typeface typeface)
 {
 this.typeface = typeface;
 }

 public FontChangeCrawler(AssetManager assets, String assetsFontFileName)
 {
 typeface = Typeface.createFromAsset(assets, assetsFontFileName);
 }

 public void replaceFonts(ViewGroup viewTree)
 {
 View child;
 for(int i = 0; i <viewTree.getChildCount(); ++i)
 {
 child = viewTree.getChildAt(i);
 if(child instanceof ViewGroup)
 {
 //recursive call
 replaceFonts((ViewGroup)child);
 }
 else if(child instanceof TextView)
 {
 //base case
 ((TextView) child).setTypeface(typeface);
 }
 }
 }
}

替換Activity的整個字體

要替換Activity布局中每個視圖中的默認字體,只需使用上面的FontChangeCrawler,就像這樣:

@Override
public void setContentView(View view)
{
 super.setContentView(view);

 FontChangeCrawler fontChanger = new FontChangeCrawler(getAssets()," font.otf" );
 fontChanger.replaceFonts((ViewGroup)this.findViewById(android.R.id.content));
}

如果你不熟悉android.R.id.content,它是在Activity布局中給View的官方標識。

考慮將上述邏輯放在BaseActivity類中。

替換字體

你還需要對每個Fragment應用FontChangeCrawler ,請考慮將此邏輯放入BaseFragment類。

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
 super.onActivityCreated(savedInstanceState);

 FontChangeCrawler fontChanger = new FontChangeCrawler(getAssets()," font.otf" );
 fontChanger.replaceFonts((ViewGroup) this.getView());
}

處理Adapter等,

替換Activity字體很長,但是,大多數人還有很多ListView ,在ListView中的列表項是在適配器內構建的,而不是在Activity中生成的,因此,你還需要在適配器中使用FontChangeCrawler

...
if(convertView == null)
{
 convertView = inflater.inflate(R.layout.listitem, null);
 fontChanger.replaceFonts((ViewGroup)convertView);
}
...



文章标签:font  自定义字体  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语