2011-08-03 107 views
32

在我的應用程序中,我需要對所有textviews和編輯文本字段使用helvetica字體。除了每個textview使用settypeface方法之外,還有什麼辦法可以做到嗎?任何建議將是一個很大的幫助。爲完整的android應用程序添加自定義字體

在此先感謝!

+0

訪問這一個:可能是它可以對你有所幫助: http://stackoverflow.com/questions/2888508/how-to-change-the-font-on-the-textview/16166184#16166184 – 2013-04-23 11:16:53

+0

不,沒有辦法。你必須捆綁你的字體,並像尼克說的那樣去做。你也可以看看這個線程[http://stackoverflow.com/questions/2376250/custom-fonts-and-xml-layouts-android](http://stackoverflow.com/questions/2376250/custom-fonts-and -xml-layouts-android) –

+0

對於任何需要ac#/ Xamarin解決方案的人來說,它擴展了textview,但也使得它是通用的,即你可以通過特定的字體路徑作爲xml上每個textview的屬性,然後在這裏查看https: //github.com/Cheesebaron/Cheesebaron.FontSample –

回答

63

我明白了我的意思。這是我使用的代碼。我創建了具有自定義字體作爲默認字體的自定義TextView

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

    private void init() { 
     Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font/chiller.ttf"); 
     setTypeface(tf ,1); 

    } 

} 
+0

你不需要擴展「TextView」,但感謝提示 – mxg

+2

@mxg我沒有得到你所說的 – Chrishan

+9

@mxg通過覆蓋TextView,他能夠在他的佈局文件中使用MyTextView,而無需以編程方式執行任何操作活動/片段來實現自定義字體。 –

9

創建一個樣式並使用它的所有文本屬性。

<style name="CustomText"> 
    <item name="android:typeface">YourFontName</item> 
</style> 

使用它:

<TextView style="@style/CustomText" /> 

以上是使用自定義字體中的所有活動進行定製,你可以使用....

Typeface font = Typeface.createFromAsset(getAssets(), "CustomFontName.ttf"); 
txt.setTypeface(font); 

嘗試。

+11

android:typeface字段只允許使用內置的字體名稱。我如何分配資產文件夾中的自定義字體名稱? – Chrishan

+0

@Chrishi看到我編輯了答案。 – Hanry

+0

+1你的回答幫助我很多@hanry –

0

好吧,你可以做到這一點,但你基本上想做的是一個有點地圖格式的字體地圖集(它必須以unicode的順序開始運行!「#$%'()x +, - 。/) 。這個函數做的是取一個字符串,並計算每個對應字母在地圖集中的位置。

它不是很容易,但每個字符必須具有相同的長度和寬度,但可以有不同的長度困難得多。

27

在你的活動,你叫

的setContentView之後(RI d.blahblah);

您應該運行一個方法來遍歷小部件的整個層次結構並處理字體替換,如:

setContentView(R.id.blahblah); 
Utils.overrideFonts(this, findViewById(android.R.id.content)); 

而提到的「overrideFonts」方法應該是類似的;

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

在這個方案中,FONT_REGULAR應以安全的地方如果你使用一個子類初始化,您可以看上一單或一些其他的方式,以確保它是正確的初始化...

private static void initializeFonts(final Context context) { 
    FONT_REGULAR = Typeface.createFromAsset(context.getAssets(), "fonts/myfont_medium.otf"); 
    FONT_BOLD = Typeface.createFromAsset(context.getAssets(), "fonts/myfont_bold.otf"); 
} 

活動像MyAppActivity(擴展活動),那麼你不需要改變每個和每個活動類的這種自定義。相反,你可以切入它並覆蓋這樣的行爲;

public class MyAppActivity extends Activity { 
... ... 
    @Override 
    public void setContentView(final int layoutResID) { 
     super.setContentView(layoutResID); 
     Utils.overrideFonts(this, findViewById(android.R.id.content)); 
    } 
... ... 
} 

這樣你可以使用你的任何活動有共同的行爲;

public class SettingsUI extends MyAppActivity { 
... ... 
} 

我希望它有幫助... 乾杯!

+6

這是簡單佈局的一個很好的解決方案。但是,如果您的活動中有ListView,則這不起作用。 ListView中的項目在setContent方法之後實例化,因此,列表中的TextView不會受此方法的影響 – Maggie

+0

您是對的,那些需要在... ItemAdapter類 – lithium

+2

那麼操作欄的字體呢? –

0

您可以在http://bit.ly/1bzjWQn

使用PixlUI導入自己的.jar在您的項目。使用它在XML

<com.neopixl.pixlui.components.textview.TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/hello_world" 
    pixlui:typeface="MyFont.ttf" /> 

不要忘實施方案(的xmlns:pixlui = 「http://schemas.android.com/apk/com.neopixl.pixlui」)

+1

爲什麼我們需要添加一些jar來完成我們純粹用Android本身所做的事情? – Chrishan

+0

您不能在Android SDK中使用自定義字體 – odemolliens

6

要應用自定義字體在所有的應用程序,只需創建以下活動:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    FontManager.getInstance().initialize(this, R.xml.fonts); 
    setContentView(R.layout.main); 
} 
@Override 
public View onCreateView(String name, Context context, AttributeSet attrs) { 
    SimpleFactory factory = new SimpleFactory(); 
    return factory.onCreateView(name, context, attrs); 
} 

其中FontManager這是管理,在/xml/fonts.xml和SimpleFactory只是工廠,創建視圖和應用自定義字體每個定義的所有字體類查看實例的文本視圖。

/xml/fonts.xml

<?xml version="1.0" encoding="utf-8"?> 
<familyset> 
    <family> 
     <nameset> 
      <!--Font name--> 
      <name>HelveticaNeueLTStd</name> 
     </nameset> 
     <fileset> 
      <!--Font styles--> 
      <file style="normal">fonts/HelveticaNeueLTStd-LtCn.otf</file> 
      <file style="bold">fonts/HelveticaNeueLTStd-MdCn.otf</file> 
      <file style="italic">fonts/HelveticaNeueLTStd-LtCnO.otf</file> 
      <file style="bold_italic">fonts/HelveticaNeueLTStd-MdCnO.otf</file> 
     </fileset> 
    </family> 
    <family> 
     <!--There new font family can be added, 
don't forget add font files into /assets/fonts directory and 
put the name of the font into /values/string/font.xml--> 
    </family> 
</familyset> 

FontFactory - abastract類,只是擴展它來創建自己的工廠

public abstract class FontFactory implements LayoutInflater.Factory{ 
    public final String TAG = getClass().getSimpleName(); 

    static final Class<?>[] mConstructorSignature = new Class[] {Context.class, AttributeSet.class}; 
    final Object[] mConstructorArgs = new Object[2]; 
    private static final String[] sClassPrefixList = { 
      "android.widget.", 
      "android.webkit." 
    }; 

    @Override 
    public View onCreateView(String name, Context context, AttributeSet attrs) { 
     if("ViewStub".equals(name) || "View".equals(name)){ 
      return null; 
     } 
     View view = null; 
     Constructor<? extends View> constructor = null; 
     Class clazz = null; 

     if (view == null) { 
      if (-1 == name.indexOf('.')) { 
       for (String prefix : sClassPrefixList) { 
        clazz = getClazz(prefix, name); 
        if(clazz != null){ 
         break; 
        } 
       } 
      } else { 
       clazz = getClazz("", name); 
      } 
     } 

     if (clazz == null) { 
      Log.d(TAG, "View can't be created " + name); 
      return null; 
     } 

     try { 
      constructor = clazz.getConstructor(mConstructorSignature); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } 

     Object[] args = mConstructorArgs; 
     args[1] = attrs; 

     if(constructor == null){ 
      return null; 
     } 

     try { 
       view = constructor.newInstance(context, attrs); 
     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 

     if(view != null){ 
      onFontApply(context, view); 
     } 
     return view; 
    } 

    public abstract void onFontApply(Context context, View view); 

    private Class getClazz(String prefix, String name){ 
     Class clazz = null; 
     try { 
      clazz = Class.forName(prefix + name); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } finally { 
      return clazz; 
     } 
    } 
} 

FontManager - 只是映射/ XML /字體定義字體文件。 xml放置在/ assets目錄中的字體文件,並通過字體名稱和字體樣式返回TypeFace。

public void initialize(Context context, int resId) { 
    if(mFonts != null){ 
     Log.d(TAG,"FontManager have already initialized"); 
     return; 
    } 
    XmlResourceParser parser = null; 
    try { 
     parser = context.getResources().getXml(resId); 
     mFonts = new ArrayList<Font>(); 

     String tag; 
     String fontStryleAttr = null; 
     int eventType = parser.getEventType(); 

     Font font = null; 

     do { 
      tag = parser.getName(); 

      switch (eventType) { 
       case XmlPullParser.START_TAG: 
        if (tag.equals(TAG_FAMILY)) { 
         // one of the font-families. 
         font = new Font(); 
        } else if (tag.equals(TAG_NAMESET)) { 
         // a list of font-family names supported. 
         font.families = new ArrayList<String>(); 
        } else if (tag.equals(TAG_NAME)) { 
         isName = true; 
        } else if (tag.equals(TAG_FILESET)) { 
         // a list of files specifying the different styles. 
         font.styles = new ArrayList<FontStyle>(); 
        } else if (tag.equals(TAG_FILE)) { 
         isFile = true; 
         fontStryleAttr = parser.getAttributeValue(null, ATTR_STYLE); 
        } 
        break; 

       case XmlPullParser.END_TAG: 
        if (tag.equals(TAG_FAMILY)) { 
         // add it to the list. 
         if (font != null) { 
          mFonts.add(font); 
          font = null; 
         } 
        } else if (tag.equals(TAG_NAME)) { 
         isName = false; 
        } else if (tag.equals(TAG_FILE)) { 
         isFile = false; 
         fontStryleAttr = null; 
        } 
        break; 

       case XmlPullParser.TEXT: 
        String text = parser.getText(); 
        if (isName) { 
         // value is a name, add it to list of family-names. 
         if (font.families != null) 
          font.families.add(text); 
        } else if (isFile) { 
         // value is a file, add it to the proper kind. 
         FontStyle fontStyle = new FontStyle(); 
         fontStyle.font = Typeface.createFromAsset(context.getAssets(), text); 
         String attr = parser.getAttributeValue(null, ATTR_STYLE); 
         if (fontStryleAttr.equals(STYLE_BOLD)) 
          fontStyle.style = Typeface.BOLD; 
         else if (fontStryleAttr.equals(STYLE_ITALIC)) 
          fontStyle.style = Typeface.ITALIC; 
         else if (fontStryleAttr.equals(STYLE_BOLD_ITALIC)) 
          fontStyle.style = Typeface.BOLD_ITALIC; 
         else 
          fontStyle.style = Typeface.NORMAL; 
         font.styles.add(fontStyle); 
        } 
      } 

      eventType = parser.next(); 

     } while (eventType != XmlPullParser.END_DOCUMENT); 

    } catch (XmlPullParserException e) { 
     throw new InflateException("Error inflating font XML", e); 
    } catch (IOException e) { 
     throw new InflateException("Error inflating font XML", e); 
    } finally { 
     if (parser != null) 
      parser.close(); 
    } 
} 

public Typeface get(String family, int style) { 
    for (Font font: mFonts) { 
     for (String familyName : font.families) { 
      if (familyName.equals(family)) { 
       // if no style in specified, return normal style. 
       if (style == -1) 
        style = Typeface.NORMAL; 
       for (FontStyle fontStyle : font.styles) { 
        if (fontStyle.style == style) 
         return fontStyle.font; 
       } 
      } 
     } 
    } 
    return mDefaultFont; 
} 

更多的代碼和樣品只看here

0
setContentView(R.layout.activity_main); 
    custfont(this, findViewById(android.R.id.content)); 



private void custfont(final Context context, 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(Typeface.createFromAsset(context.getAssets(), "fonts/ostrichblack.ttf")); 
     } 
    } 
    catch (Exception e) 
    { 
    } 
} 
0
import android.content.Context; 
import android.graphics.Typeface; 

/** 
* Created by Sanjeev Kumar on 4/18/2017. 
*/ 

public class FontManager { 
    public Context mContext; 

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

    public Typeface getSquarkiFont() { 
     return Typeface.createFromAsset(mContext.getAssets(), "fonts/Squarki.ttf"); 
    } 

    public Typeface getLazySpringDayFont() { 
     return Typeface.createFromAsset(mContext.getAssets(), "fonts/LazySpringDay.ttf"); 
    } 
} 
相關問題