2012-01-09 5 views
43

Có cách nào để thêm phông chữ tùy chỉnh trong Chủ đề trong Android không?Thêm Phông chữ tùy chỉnh vào Chủ đề trong Android

Tôi đã đọc Quick Tip: Customize Android Fonts, nhưng ở đây chúng tôi phải lập trình thêm phông chữ tùy chỉnh vào văn bản.

TextView txt = (TextView) findViewById(R.id.custom_font); 
Typeface font = Typeface.createFromAsset(getAssets(), "Chantelli_Antiqua.ttf"); 
txt.setTypeface(font); 

Nhưng tôi muốn đặt phông chữ tùy chỉnh theo kiểu/chủ đề.

Trả lời

-1

Tôi hy vọng đây là ý của bạn, nhưng nếu không phải là một tham chiếu tốt cho người khác.

** Lưu ý: Phông chữ có thể được tìm thấy máy tính/Local Disk (C:)/Windows/Fonts **

Sao chép font mà bạn muốn sử dụng trong thư mục Fonts trên và dán nó vào một mới đã tạo thư mục trong thư mục asset trong Eclipse.

private void initTypeFace() 
    { 
     TypeFace tf = TypeFace.createFromAsset(getAsset(), 
         "Chantelli Antiqua.ttf"); 

     TextView txt = (TextView) findViewById(R.id.custom_font); 

     txt.setTypeface(tf); 
     example_button1.setTypeface(tf); 
     example_button2.setTypeface(tf); 
    } 
0

Tôi nghĩ rằng câu trả lời cho câu hỏi của bạn woulbe được TextView tùy chỉnh với thông số XML bổ sung, mà bạn có thể bao gồm các chủ đề của bạn.

Bạn có thể phân tích giá trị này trong TextView của hàm tạo (Ngữ cảnh bối cảnh, AttributeSet attrs) để khởi tạo nó. Kiểm tra liên kết this ví dụ về xác định attrs tùy chỉnh cho các chế độ xem của bạn và khởi tạo chúng.

12

Tôi cho rằng đây là bản sao của this questionthis one.

Trong hoạt động của tôi trong thời gian chạy, tôi sử dụng một cái gì đó như thế này:

FontUtils.setCustomFont(findViewById(R.id.top_view), getAssets()); 

Trong XML:

 <TextView 
      android:id="@+id/my_label" 
      android:tag="condensed" 
      android:text="@string/label" 
      ... /> 

Vì vậy, về mặt lý thuyết bạn có thể tạo phong cách và sử dụng nó cùng với mã FontUtils/runtime.

<style name="roboto_condensed"> 
    <item name="android:tag">condensed,your-own-css-like-language-here</item> 
</style> 

FontUtils lớp:

public class FontUtils { 
    private static Typeface normal; 

    private static Typeface bold; 

    private static Typeface condensed; 

    private static Typeface light; 

    private static void processsViewGroup(ViewGroup v, final int len) { 

    for (int i = 0; i < len; i++) { 
     final View c = v.getChildAt(i); 
     if (c instanceof TextView) { 
     setCustomFont((TextView) c); 
     } else if (c instanceof ViewGroup) { 
     setCustomFont((ViewGroup) c); 
     } 
    } 
    } 

    private static void setCustomFont(TextView c) { 
    Object tag = c.getTag(); 
    if (tag instanceof String) { 
     if (((String) tag).contains("bold")) { 
     c.setTypeface(bold); 
     return; 
     } 
     if (((String) tag).contains("condensed")) { 
     c.setTypeface(condensed); 
     return; 
     } 
     if (((String) tag).contains("light")) { 
     c.setTypeface(light); 
     return; 
     } 
    } 
    c.setTypeface(normal); 
    } 

    public static void setCustomFont(View topView, AssetManager assetsManager) { 
    if (normal == null || bold == null || condensed == null || light == null) { 
     normal = Typeface.createFromAsset(assetsManager, "fonts/roboto/Roboto-Regular.ttf"); 
     bold = Typeface.createFromAsset(assetsManager, "fonts/roboto/Roboto-Bold.ttf"); 
     condensed = Typeface.createFromAsset(assetsManager, "fonts/roboto/Roboto-Condensed.ttf"); 
     light = Typeface.createFromAsset(assetsManager, "fonts/roboto/Roboto-Light.ttf"); 
    } 

    if (topView instanceof ViewGroup) { 
     setCustomFont((ViewGroup) topView); 
    } else if (topView instanceof TextView) { 
     setCustomFont((TextView) topView); 
    } 
    } 

    private static void setCustomFont(ViewGroup v) { 
    final int len = v.getChildCount(); 
    processsViewGroup(v, len); 
    } 
} 
3

Bạn có thể bao gồm loại phông chữ tùy chỉnh của bạn trong thư mục tài sản và truy xuất nó từ đó.

Khai báo kiểu chữ như:

Typeface helveticaBold; 
Typeface helveticaRegular; 

trong onCreate() viết đoạn mã sau:

helveticaBold = Typeface.createFromAsset(getAssets(), "helvetica_bold.ttf"); 
helveticaRegular = Typeface.createFromAsset(getAssets(), "helvetica_regular.ttf"); 

cuối cùng, thiết lập các kiểu chữ của văn bản của TextView hoặc EditText như:

editText.setTypeface(helveticaRegular); 

đó là ...

+0

có, nhưng không phải những gì anh ấy yêu cầu – user1010160

4

Bằng cách sử dụng CustomTextView, bạn chỉ định tên tệp phông chữ trong thư mục assets của bạn trực tiếp trong tệp bố cục XML của bạn.

câu trả lời của tôi là here

19

Thật không may, Android không cung cấp cách nhanh chóng, dễ dàng và sạch sẽ bạn đang tìm kiếm để thay đổi phông chữ cho toàn bộ ứng dụng của bạn. Nhưng gần đây tôi đã xem xét vấn đề này và tạo ra một số công cụ cho phép bạn thay đổi phông chữ mà không cần bất kỳ mã hóa nào (bạn có thể thực hiện tất cả thông qua xml, kiểu và thậm chí cả văn bản xuất hiện). Chúng dựa trên các giải pháp tương tự như bạn thấy trong các câu trả lời khác ở đây, nhưng cho phép linh hoạt hơn nhiều. Bạn có thể đọc tất cả về nó trên this blog và xem dự án github here.

Dưới đây là ví dụ về cách áp dụng các công cụ này. Đặt tất cả các tệp phông chữ của bạn trong assets/fonts/. Sau đó, hãy khai báo các phông chữ đó trong tệp xml (ví dụ: res/xml/fonts.xml) và tải tệp này sớm trong ứng dụng của bạn với TypefaceManager.initialize(this, R.xml.fonts); (ví dụ: trong onCreate của lớp Ứng dụng của bạn). Các tập tin xml trông như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<familyset> 

    <!-- Some Font. Can be referenced with 'someFont' or 'aspergit' --> 
    <family> 
     <nameset> 
      <name>aspergit</name> 
      <name>someFont</name> 
     </nameset> 
     <fileset> 
      <file>Aspergit.ttf</file> 
      <file>Aspergit Bold.ttf</file> 
      <file>Aspergit Italic.ttf</file> 
      <file>Aspergit Bold Italic.ttf</file> 
     </fileset> 
    </family> 

    <!-- Another Font. Can be referenced with 'anotherFont' or 'bodoni' --> 
    <family> 
     <nameset> 
      <name>bodoni</name> 
      <name>anotherFont</name> 
     </nameset> 
     <fileset> 
      <file>BodoniFLF-Roman.ttf</file> 
      <file>BodoniFLF-Bold.ttf</file> 
     </fileset> 
    </family> 

</familyset> 

Bây giờ bạn có thể sử dụng các phông chữ theo phong cách hay xml (với điều kiện bạn sử dụng các công cụ tôi đã đề cập ở trên) của bạn, bằng cách thiết lập thuộc tính flFont trong TextView tùy chỉnh com.innovattic.font.FontTextView trong cách bố trí xml của bạn . Dưới đây bạn có thể thấy cách bạn có thể áp dụng một phông chữ cho tất cả các văn bản trong toàn bộ ứng dụng của bạn, chỉ cần bằng cách chỉnh sửa res/values/styles.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> 

    <!-- Application theme --> 
    <!-- Use a different parent if you don't want Holo Light --> 
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> 
     <item name="android:textViewStyle">@style/MyTextViewStyle</item> 
    </style> 

    <!-- Style to use for ALL text views (including FontTextView) --> 
    <!-- Use a different parent if you don't want Holo Light --> 
    <style name="MyTextViewStyle" parent="@android:style/Widget.Holo.Light.TextView"> 
     <item name="android:textAppearance">@style/MyTextAppearance</item> 
    </style> 

    <!-- Text appearance to use for ALL text views (including FontTextView) --> 
    <!-- Use a different parent if you don't want Holo Light --> 
    <style name="MyTextAppearance" parent="@android:style/TextAppearance.Holo"> 
     <!-- Alternatively, reference this font with the name "aspergit" --> 
     <!-- Note that only our own TextView's will use the font attribute --> 
     <item name="flFont">someFont</item> 
     <item name="android:textStyle">bold|italic</item> 
    </style> 

    <!-- Alternative style, maybe for some other widget --> 
    <style name="StylishFont"> 
     <item name="flFont">anotherFont</item> 
     <item name="android:textStyle">normal</item> 
    </style> 

</resources> 

Với sự kèm res/layout/layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" > 

    <!-- This text view is styled with the app theme --> 
    <com.innovattic.font.FontTextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="This uses my font in bold italic style" /> 

    <!-- This text view is styled here and overrides the app theme --> 
    <com.innovattic.font.FontTextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     app:flFont="anotherFont" 
     android:textStyle="normal" 
     android:text="This uses another font in normal style" /> 

    <!-- This text view is styled with a style and overrides the app theme --> 
    <com.innovattic.font.FontTextView 
     style="@style/StylishFont" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="This also uses another font in normal style" /> 

</LinearLayout> 

Đừng quên để áp dụng các chủ đề trong tệp kê khai Android của bạn.

+0

cảm ơn! Bài viết tuyệt vời .. –

+0

Khi bạn đang sử dụng mã java là tốt thì chúng ta có thể làm điều đó theo cách đơn giản hơn –

+0

Điều này thực sự nên được bản địa trong Android – Zach