Android - การใช้แบบอักษรที่กำหนดเอง


266

ฉันใช้แบบอักษรที่กำหนดเองกับ TextViewแต่ดูเหมือนจะไม่เปลี่ยนแบบอักษร

นี่คือรหัสของฉัน:

    Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf");
    TextView myTextView = (TextView)findViewById(R.id.myTextView);
    myTextView.setTypeface(myTypeface);

ใครช่วยได้โปรดนำฉันออกจากปัญหานี้ได้ไหม


1
มีข้อผิดพลาดในไวยากรณ์ของคุณควรเป็นmyTextView.setTypeface(myTypeface);
yuttadhammo

กระทู้นี้คล้ายกับ: stackoverflow.com/a/14558090/693752
Snicolas

ตรวจสอบตัวอย่างการทำงานjavatechig.com/2013/03/19/using-external-fonts-in-android-view
Nilanchal


ที่นี่คุณมีวิธีที่มีประสิทธิภาพในการเปลี่ยนแบบอักษรสำหรับแอปพลิเคชันทั้งหมด: stackoverflow.com/questions/18847531/ …
Diego Palomar

คำตอบ:


230

บน Mobiletuts + มีการสอนที่ดีมากเกี่ยวกับการจัดรูปแบบข้อความสำหรับ Android เคล็ดลับด่วน: ปรับแต่งแบบอักษร Android

แก้ไข: ทดสอบด้วยตนเองตอนนี้ นี่คือทางออก คุณสามารถใช้โฟลเดอร์ย่อยที่เรียกว่าแบบอักษร แต่ต้องไปในassetsโฟลเดอร์ไม่ใช่resโฟลเดอร์ ดังนั้น

สินทรัพย์ / แบบอักษร

ตรวจสอบให้แน่ใจด้วยว่าการสิ้นสุดแบบอักษรฉันหมายถึงจุดสิ้นสุดของไฟล์แบบอักษรนั้นเป็นตัวพิมพ์เล็กทั้งหมด กล่าวอีกนัยหนึ่งไม่ควรmyFont.TTFแต่myfont.ttf วิธีนี้จะต้องเป็นตัวพิมพ์เล็ก


แก้ไขคำตอบของฉันด้วยโซลูชันทันที
Octavian A. Damiean

ช่วยเล่าโครงการตัวอย่างที่ใช้การได้ให้ฉันหน่อยได้ไหม? ฉันลองทั้งในทรัพย์สิน / fonts / xyz.ttf และโฟลเดอร์ asset / xyz.ttf แล้ว แต่ไม่ได้ใช้ฟอนต์นั้น มันจะแสดงเฉพาะแบบอักษรเริ่มต้น ..
RATTLESNAKE

2
แน่ใจว่านี่คือลิงค์ไปยังโครงการซิป dl.dropbox.com/u/8288893/customFont.zip
Octavian A. Damiean

5
หากคุณกำลังติดตามพร้อมกับบทช่วยสอนนั้นตรวจสอบให้แน่ใจว่าคุณใช้พา ธ Typeface.createFromAsset (getAssets (), "fonts / yourfont.ttf"); หากคุณใส่ไว้ในไดเรกทอรีย่อยแบบอักษร
Jameo

ไม่รวม "ทรัพย์สิน /" ในชื่อไฟล์ (เพราะcreateFromAssetฟังก์ชั่นชี้ตรงไปยังassetsไดเรกทอรี)
topher

55

หลังจากลองวิธีแก้ปัญหาส่วนใหญ่ที่อธิบายไว้ในหัวข้อนี้ฉันพบการประดิษฐ์ตัวอักษรโดยไม่ตั้งใจ ( https://github.com/chrisjenx/Calligraphy ) - ห้องสมุดของ Christopher Jenkins ที่ให้คุณเพิ่มแบบอักษรที่กำหนดเองลงในแอปของคุณได้อย่างง่ายดาย ข้อดีของ lib ของเขาเปรียบเทียบกับแนวทางที่แนะนำคือ:

  1. คุณไม่จำเป็นต้องแนะนำส่วนประกอบ TextView ของคุณเองคุณใช้ TextView ในตัว
  2. คุณสามารถรวมไลบรารีโดยใช้ gradle ได้อย่างง่ายดาย
  3. ห้องสมุดไม่ได้ จำกัด แบบอักษรที่คุณเลือก คุณเพียงแค่เพิ่มคนที่คุณต้องการในสินทรัพย์
  4. คุณไม่เพียง แต่รับมุมมองข้อความที่กำหนดเองเท่านั้นส่วน compontents Android แบบข้อความอื่น ๆ ทั้งหมดก็จะแสดงโดยใช้แบบอักษรที่กำหนดเองของคุณ

1
สิ่งที่เป็นขนาดของห้องสมุดที่เป็นคำถามที่สำคัญเพราะนั่นคือจะมีผลต่อขนาดของ app
eRaisedToX

32

ฉันรู้ว่ามีคำตอบที่ดีอยู่แล้ว แต่นี่คือการดำเนินการอย่างเต็มที่

นี่คือมุมมองข้อความที่กำหนดเอง:

package com.mycompany.myapp.widget;

/**
 * Text view with a custom font.
 * <p/>
 * In the XML, use something like {@code customAttrs:customFont="roboto-thin"}. The list of fonts
 * that are currently supported are defined in the enum {@link CustomFont}. Remember to also add
 * {@code xmlns:customAttrs="http://schemas.android.com/apk/res-auto"} in the header.
 */
public class CustomFontTextView extends TextView {

    private static final String sScheme =
            "http://schemas.android.com/apk/res-auto";
    private static final String sAttribute = "customFont";

    static enum CustomFont {
        ROBOTO_THIN("fonts/Roboto-Thin.ttf"),
        ROBOTO_LIGHT("fonts/Roboto-Light.ttf");

        private final String fileName;

        CustomFont(String fileName) {
            this.fileName = fileName;
        }

        static CustomFont fromString(String fontName) {
            return CustomFont.valueOf(fontName.toUpperCase(Locale.US));
        }

        public Typeface asTypeface(Context context) {
            return Typeface.createFromAsset(context.getAssets(), fileName);
        }
    }

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

        if (isInEditMode()) {
            return;
        } else {
            final String fontName = attrs.getAttributeValue(sScheme, sAttribute);

            if (fontName == null) {
                throw new IllegalArgumentException("You must provide \"" + sAttribute + "\" for your text view");
            } else {
                final Typeface customTypeface = CustomFont.fromString(fontName).asTypeface(context);
                setTypeface(customTypeface);
            }
        }
    }
}

นี่คือแอตทริบิวต์ที่กำหนดเอง สิ่งนี้ควรไปที่res/attrs.xmlไฟล์ของคุณ:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CustomFontTextView">
        <attr name="customFont" format="string"/>
    </declare-styleable>
</resources>

และนี่คือวิธีการใช้งาน ฉันจะใช้เลย์เอาต์แบบสัมพัทธ์เพื่อตัดมันและแสดงcustomAttrคำประกาศ แต่มันอาจเป็นเลย์เอาต์อะไรก็ได้ที่คุณมีอยู่แล้ว

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:customAttrs="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.mycompany.myapp.widget.CustomFontTextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="foobar"
         customAttrs:customFont="roboto_thin" />

</RelativeLayout>

สิ่งที่ไม่customAttrsอ้างถึงในโครงการของฉัน?
Skynet

@Skynet มันหมายถึง namespace xmlns:customAttrs="http://schemas.android.com/apk/res-auto"ที่กำหนดไว้ในมุมมองรากของคุณซึ่งเป็น สิ่งนี้จะได้รับแอตทริบิวต์ที่ตั้งค่าโดยอัตโนมัติสำหรับมุมมองที่กำหนดเอง ในกรณีนี้คุณมีแอตทริบิวต์ชื่อ customFont ที่กำหนดไว้ใน attrs.xml วิธีที่ง่ายกว่าในการทำความเข้าใจคือดูxmlns:android="http://schemas.android.com/apk/res/android"ว่ากำหนดเนมสเปซสำหรับแอตทริบิวต์ Android ของคุณอย่างไร ดังนั้นถ้าคุณเปลี่ยนที่aแล้วแทนก็ต้องการจะandroid:text a:text
CodyEngel

14

ฉันเคยใช้มันมาก่อน ข้อแตกต่างระหว่างการติดตั้งใช้งานของเราคือฉันไม่ได้ใช้โฟลเดอร์ย่อยในสินทรัพย์ ไม่แน่ใจว่าจะเปลี่ยนอะไรไหม


13

หากคุณวางแบบอักษรในตำแหน่งที่ถูกต้องและไม่มีข้อผิดพลาดในไฟล์แบบอักษรตัวเองรหัสของคุณควรจะทำงานเช่นนั้น RATTLESNAKE

อย่างไรก็ตามมันจะง่ายขึ้นมากถ้าคุณสามารถกำหนดฟอนต์ในเลย์เอาต์ 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>

ด้วยประกอบ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>

ฉันสร้างเครื่องมือสองสามอย่างโดยเฉพาะเพื่อจุดประสงค์นี้ อ้างถึงโครงการนี้จาก GitHub หรือดูโพสต์บล็อกนี้ซึ่งจะอธิบายทุกสิ่ง


13

วิธีที่ดีที่สุดที่จะทำจากการเปิดตัวตัวอย่าง Android O เป็นวิธีนี้: ใช้

งานได้เฉพาะในกรณีที่คุณมี android studio-2.4 ขึ้นไป

  1. คลิกขวาที่ละเอียดโฟลเดอร์และไปที่ใหม่> ไดเรกทอรีทรัพยากร
    หน้าต่างไดเรกทอรีทรัพยากรใหม่จะปรากฏขึ้น
  2. ในรายการประเภททรัพยากรให้เลือกแบบอักษรแล้วคลิกตกลง
  3. เพิ่มไฟล์แบบอักษรของคุณในแบบอักษรโฟลเดอร์โครงสร้างโฟลเดอร์ได้โดยง่ายด้านล่างสร้างR.font.dancing_script, และR.font.la_laR.font.ba_ba
  4. คลิกสองครั้งที่ไฟล์แบบอักษรเพื่อดูตัวอย่างแบบอักษรของไฟล์ในเครื่องมือแก้ไข

ต่อไปเราจะต้องสร้างตระกูลตัวอักษร:

  1. คลิกขวาที่โฟลเดอร์ตัวอักษรและไปที่ใหม่> Font แฟ้มทรัพยากร หน้าต่างไฟล์ทรัพยากรใหม่จะปรากฏขึ้น
  2. ใส่ชื่อแฟ้มแล้วคลิกตกลง แบบอักษรทรัพยากร XML ใหม่จะเปิดขึ้นในตัวแก้ไข
  3. ใส่แต่ละไฟล์ฟอนต์สไตล์และแอตทริบิวต์ของน้ำหนักในองค์ประกอบแท็กแบบอักษร XML ต่อไปนี้แสดงการเพิ่มแอตทริบิวต์ที่เกี่ยวข้องกับแบบอักษรใน XML ทรัพยากรของแบบอักษร:

การเพิ่มแบบอักษรไปยัง TextView:

   <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="@font/hey_fontfamily"/>

จากเอกสารประกอบ

การทำงานกับแบบอักษร

ขั้นตอนทั้งหมดถูกต้อง


4
ony api> 26 ((
maXp


นี่เป็นขั้นตอนที่ขาดหายไปอย่างมาก # 3 ... คุณจะทำอย่างไร
รหัส Wiget

12

สำหรับ Custom Fonts ใน android ให้สร้างโฟลเดอร์ที่อยู่ในชื่อโฟลเดอร์ชื่อว่า "fonts" ให้วางไฟล์ fonts.ttf หรือ. otf ที่คุณต้องการ

หากคุณขยาย UIBaseFragment:

Typeface font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Arial.ttf");
        tv.setTypeface(font);

อื่นถ้าขยายกิจกรรม:

Typeface font = Typeface.createFromAsset(getContext().getAssets(), "fonts/Arial.ttf");
        tv.setTypeface(font);

7

คุณสามารถใช้ PixlUI ได้ที่https://github.com/neopixl/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="GearedSlab.ttf" />

4

เนื่องจากฉันไม่พอใจกับวิธีแก้ปัญหาที่นำเสนอทั้งหมดดังนั้นฉันจึงคิดเรื่องนี้ขึ้นมา มันขึ้นอยู่กับเคล็ดลับเล็ก ๆ น้อย ๆ ที่มีแท็ก (เช่นคุณไม่สามารถใช้แท็กในรหัสของคุณ) ฉันใส่เส้นทางแบบอักษรที่นั่น ดังนั้นเมื่อกำหนดมุมมองคุณสามารถทำสิ่งนี้:

<TextView
        android:id="@+id/textViewHello1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World 1"
        android:tag="fonts/Oswald-Regular.ttf"/>

หรือสิ่งนี้:

<TextView
        android:id="@+id/textViewHello2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World 2"
        style="@style/OswaldTextAppearance"/>

<style name="OswaldTextAppearance">
        <item name="android:tag">fonts/Oswald-Regular.ttf</item>
        <item name="android:textColor">#000000</item>
</style>

ตอนนี้คุณสามารถเข้าถึง / ตั้งค่ามุมมองได้อย่างชัดเจนดังนี้:

TextView textView = TextViewHelper.setupTextView(this, R.id.textViewHello1).setText("blah");

หรือเพียงแค่ติดตั้งทุกอย่างผ่าน:

TextViewHelper.setupTextViews(this, (ViewGroup) findViewById(R.id.parentLayout)); // parentLayout is the root view group (relative layout in my case)

และชั้นเวทมนต์ที่คุณถามคืออะไร? ส่วนใหญ่ติดกาวจากโพสต์ SO อื่นด้วยวิธีการช่วยเหลือสำหรับทั้งกิจกรรมและชิ้นส่วน:

import android.app.Activity;
import android.content.Context;
import android.graphics.Typeface;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.HashMap;
import java.util.Map;

public class TextViewHelper {
    private static final Map<String, Typeface> mFontCache = new HashMap<>();

    private static Typeface getTypeface(Context context, String fontPath) {
        Typeface typeface;
        if (mFontCache.containsKey(fontPath)) {
            typeface = mFontCache.get(fontPath);
        } else {
            typeface = Typeface.createFromAsset(context.getAssets(), fontPath);
            mFontCache.put(fontPath, typeface);
        }
        return typeface;
    }

    public static void setupTextViews(Context context, ViewGroup parent) {
        for (int i = parent.getChildCount() - 1; i >= 0; i--) {
            final View child = parent.getChildAt(i);
            if (child instanceof ViewGroup) {
                setupTextViews(context, (ViewGroup) child);
            } else {
                if (child != null) {
                    TextViewHelper.setupTextView(context, child);
                }
            }
        }
    }

    public static void setupTextView(Context context, View view) {
        if (view instanceof TextView) {
            if (view.getTag() != null) // also inherited from TextView's style
            {
                TextView textView = (TextView) view;
                String fontPath = (String) textView.getTag();
                Typeface typeface = getTypeface(context, fontPath);
                if (typeface != null) {
                    textView.setTypeface(typeface);
                }
            }
        }
    }

    public static TextView setupTextView(View rootView, int id) {
        TextView textView = (TextView) rootView.findViewById(id);
        setupTextView(rootView.getContext().getApplicationContext(), textView);
        return textView;
    }

    public static TextView setupTextView(Activity activity, int id) {
        TextView textView = (TextView) activity.findViewById(id);
        setupTextView(activity.getApplicationContext(), textView);
        return textView;
    }
}

4

น่าเสียดายที่ไม่มีวิธีแก้ปัญหาที่ดีสำหรับเรื่องนี้

ฉันได้เห็นบทความมากมายเกี่ยวกับการใช้ TextView ที่กำหนดเอง แต่สิ่งที่พวกเขาลืมไปว่าไม่ใช่เพียงแค่การแสดงข้อความที่สามารถใช้แบบอักษรและมีการซ่อน textviews ในมุมมองอื่น ๆ ที่นักพัฒนาไม่สามารถเข้าถึงได้ ฉันจะไม่เริ่มต้นSpannableด้วยซ้ำ

คุณสามารถใช้ยูทิลิตี้แบบอักษรภายนอกเช่น:

เครื่องมือแบบอักษรประดิษฐ์ตัวอักษร

แต่สิ่งนี้จะวนซ้ำทุกมุมมองในแอปพลิเคชันที่สร้างและแม้แต่ยูทิลิตี้นี้พลาดบางมุมมอง (ViewPager แสดงผลแบบอักษรปกติ) จากนั้นคุณมีปัญหาคือเมื่อ Google อัปเดตเครื่องมือสร้างของพวกเขา นอกจากนี้ยังเป็นเพียงเล็กน้อยช้าที่จะใช้การสะท้อนของ Java

มันขึ้นอยู่กับ Google แล้วที่จะแก้ไขปัญหานี้ เราต้องการการสนับสนุนแบบอักษรที่ดีขึ้นใน Android ถ้าคุณดูวิธีการแก้ปัญหาจาก iOS พวกเขามีแบบอักษร 100 แบบให้เลือก ต้องการแบบอักษรที่กำหนดเองหรือไม่ เพียงวาง TFF ลงและสามารถใช้งานได้ ..

สำหรับตอนนี้ถูก จำกัด เฉพาะข้อเสนอที่ Google เสนอให้เราซึ่งมีข้อ จำกัด อย่างมาก แต่ได้รับการปรับปรุงให้เหมาะกับมือถือ


2

ตรวจสอบให้แน่ใจว่าได้วางโค้ดด้านบนลงใน onCreate () หลังจากที่คุณโทรไปที่ super และการเรียกไปที่ setContentView () รายละเอียดเล็ก ๆ นี้ทำให้ฉันยังอยู่ได้นาน


2

ด้วยAndroid 8.0 ที่ใช้ Custom Fonts ในแอปพลิเคชันนั้นง่ายdownloadable fontsมาก เราสามารถเพิ่มแบบอักษรโดยตรงไปยังres/font/ folderในโฟลเดอร์โครงการและในการทำเช่นนั้นแบบอักษรจะพร้อมใช้งานโดยอัตโนมัติใน Android Studio

โฟลเดอร์ที่อยู่ภายใต้ res ด้วยชื่อแบบอักษรและประเภทที่กำหนดเป็นแบบอักษร

ตอนนี้ตั้งค่าfontFamilyแอตทริบิวต์เป็นรายการแบบอักษรหรือคลิกที่เพิ่มเติมและเลือกแบบอักษรที่คุณเลือก สิ่งนี้จะเพิ่มtools:fontFamily="@font/your_font_file"บรรทัดใน TextView ของคุณ

สิ่งนี้จะสร้างไฟล์สองสามไฟล์โดยอัตโนมัติ

1.fonts_certs.xmlในค่าโฟลเดอร์ก็จะสร้าง

2.ในรายการจะเพิ่มบรรทัดนี้:

  <meta-data
            android:name="preloaded_fonts"
            android:resource="@array/preloaded_fonts" /> 

3 preloaded_fonts.xml

<resources>
    <array name="preloaded_fonts" translatable="false">
        <item>@font/open_sans_regular</item>
        <item>@font/open_sans_semibold</item>
    </array>
</resources>

2

คุณสามารถใช้EasyFonts library บุคคลที่สามที่ง่ายและสะดวกในการตั้งค่าฟอนต์ที่กำหนดเองให้เป็นของคุณTextViewห้องสมุดบุคคลที่สามเพื่อความหลากหลายชุดของตัวอักษรที่กำหนดเองเพื่อคุณด้วยการใช้ไลบรารี่นี้คุณไม่ต้องกังวลกับการดาวน์โหลดและเพิ่มฟอนต์ในโฟลเดอร์ทรัพย์สิน / ฟอนต์ ยังเกี่ยวกับการสร้างวัตถุแบบอักษร

แทน

Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf");
TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(myTypeface);

เพียง:

TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(EasyFonts.robotoThin(this));

ห้องสมุดนี้ยังมีแบบอักษรต่อไปนี้

  • Roboto
  • Droid Serif
  • หุ่นยนต์ Droid
  • เสรีภาพ
  • Fun Raiser
  • Android Nation
  • อะโวคาโดสีเขียว
  • การรับรู้

1

ฉันมีปัญหาเดียวกัน TTF ไม่ปรากฏขึ้น ฉันเปลี่ยนไฟล์ฟอนต์และด้วยรหัสเดียวกันมันใช้งานได้


1

หากคุณต้องการโหลดแบบอักษรจากเครือข่ายหรือจัดรูปแบบได้อย่างง่ายดายคุณสามารถใช้:

https://github.com/shellum/fontView

ตัวอย่าง:

<!--Layout-->
<com.finalhack.fontview.FontView
        android:id="@+id/someFontIcon"
        android:layout_width="80dp"
        android:layout_height="80dp" />

//Java:
fontView.setupFont("http://blah.com/myfont.ttf", true, character, FontView.ImageType.CIRCLE);
fontView.addForegroundColor(Color.RED);
fontView.addBackgroundColor(Color.WHITE);

1

หลังจากเจ็ดปีคุณสามารถเปลี่ยนแอปทั้งหมดtextViewหรือสิ่งที่คุณต้องการได้อย่างง่ายดายโดยใช้android.supportไลบรารี่ 26 ++

เช่น:

สร้างแอปแพคเกจแบบอักษรของคุณ/ src / res / fontและย้ายแบบอักษรของคุณลงไป

ป้อนคำอธิบายรูปภาพที่นี่

และในธีมแอปของคุณเพียงเพิ่มเป็นฟอนต์ Family:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
   . . . ...
    <item name="android:fontFamily">@font/demo</item>
</style>

ตัวอย่างสำหรับใช้กับtextViewเท่านั้น:

<style name="fontTextView" parent="@android:style/Widget.TextView">
    <item name="android:fontFamily">monospace</item>
</style>

และเพิ่มเข้าไปในธีมหลักของคุณ:

<item name="android:textViewStyle">@style/fontTextView</item>

ปัจจุบันมันใช้งานได้กับ8.1 จนถึง 4.1 API Jelly Beanและนั่นก็เป็นช่วงกว้าง


1

อัปเดตคำตอบ: Android 8.0 (API ระดับ 26) แนะนำคุณลักษณะใหม่แบบอักษรใน XML เพียงใช้ฟีเจอร์แบบอักษรใน XML บนอุปกรณ์ที่ใช้ Android 4.1 (API ระดับ 16) และสูงกว่าให้ใช้ไลบรารีการสนับสนุน 26

เห็นลิงค์นี้


คำตอบเก่า

มีสองวิธีในการปรับแต่งแบบอักษร:

!!! แบบอักษรที่กำหนดเองของฉันใน asset / fonts / iran_sans.ttf



วิธีที่ 1: การ แก้ไข Typeface.class ||| วิธีที่ดีที่สุด

โทร FontsOverride.setDefaultFont () ในชั้นเรียนขยายแอพลิเคชัน, รหัสนี้จะทำให้แบบอักษรซอฟต์แวร์ทั้งหมดจะมีการเปลี่ยนแปลงแม้กระทั่งแบบอักษร Toasts

AppController.java

public class AppController extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        //Initial Font
        FontsOverride.setDefaultFont(getApplicationContext(), "MONOSPACE", "fonts/iran_sans.ttf");

    }
}

FontsOverride.java

public class FontsOverride {

    public static void setDefaultFont(Context context, String staticTypefaceFieldName, String fontAssetName) {
        final Typeface regular = Typeface.createFromAsset(context.getAssets(), fontAssetName);
        replaceFont(staticTypefaceFieldName, regular);
    }

    private static void replaceFont(String staticTypefaceFieldName, final Typeface newTypeface) {
        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();
        }
    }
}



วิธีที่ 2:ใช้ setTypeface

สำหรับมุมมองพิเศษเพียงเรียก setTypeface () เพื่อเปลี่ยนแบบอักษร

CTextView.java

public class CTextView extends TextView {

    public CTextView(Context context) {
        super(context);
        init(context,null);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context,attrs);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context,attrs);
    }

    public void init(Context context, @Nullable AttributeSet attrs) {

        if (isInEditMode())
            return;

        // use setTypeface for change font this view
        setTypeface(FontUtils.getTypeface("fonts/iran_sans.ttf"));

    }
}

FontUtils.java

public class FontUtils {

    private static Hashtable<String, Typeface> fontCache = new Hashtable<>();

    public static Typeface getTypeface(String fontName) {
        Typeface tf = fontCache.get(fontName);
        if (tf == null) {
            try {
                tf = Typeface.createFromAsset(AppController.getInstance().getApplicationContext().getAssets(), fontName);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            fontCache.put(fontName, tf);
        }
        return tf;
    }

}

0

วิธีที่ถูกต้องในการทำเช่นนี้ของ API 26 มีการอธิบายไว้ในเอกสารอย่างเป็นทางการที่นี่:

https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

สิ่งนี้เกี่ยวข้องกับการวางไฟล์ ttf ในโฟลเดอร์ res / font และสร้างไฟล์ตระกูล font



0
  • เปิดโครงการของคุณแล้วเลือกโครงการที่ด้านบนซ้าย
  • แอป -> src -> หลัก
  • คลิกขวาที่หลักและสร้างชื่อไดเรกทอรีเป็นสินทรัพย์
  • คลิกขวาเพื่อยืนยันและสร้างชื่อไดเรกทอรีใหม่ แบบอักษร
  • คุณต้องค้นหาแบบอักษรฟรีเช่นแบบอักษรฟรี
  • มอบให้กับ Textview ของคุณและเรียกมันในคลาสกิจกรรมของคุณ
  • คัดลอกแบบอักษรของคุณภายในโฟลเดอร์แบบอักษร
  • TextView txt = (TextView) findViewById(R.id.txt_act_spalsh_welcome); Typeface font = Typeface.createFromAsset(getAssets(), "fonts/Aramis Italic.ttf"); txt.setTypeface(font);

ชื่อของแบบอักษรจะต้องถูกต้องและสนุก


0

ใช่แบบอักษรที่ดาวน์โหลดได้นั้นง่ายมากดังที่Dipaliกล่าว

นี่คือวิธีที่คุณทำ ...

  1. TextViewสถานที่
  2. ในบานหน้าต่างคุณสมบัติเลือกfontFamilyดรอปดาวน์ หากไม่มีให้ค้นหาเครื่องหมายรูปหมวก (the> แล้วคลิกเพื่อขยายtextAppearance) ภายใต้
  3. ขยายรายการfont-familyแบบหล่นลง
  4. ในรายการเล็กน้อยให้เลื่อนลงไปจนเห็น more fonts
  5. นี่จะเป็นการเปิดกล่องโต้ตอบที่คุณสามารถค้นหาได้ Google Fonts
  6. ค้นหาแบบอักษรที่คุณชอบด้วยแถบค้นหาที่ด้านบน
  7. เลือกแบบอักษรของคุณ
  8. เลือกสไตล์ของแบบอักษรที่คุณชอบ (เช่นตัวหนาปกติตัวเอียง ฯลฯ )
  9. ในบานหน้าต่างด้านขวาให้เลือกปุ่มตัวเลือกที่ระบุ Add font to project
  10. คลิกตกลง ตอนนี้ TextView ของคุณมีแบบอักษรที่คุณชอบ!

โบนัส: หากคุณต้องการสไตล์ทุกสิ่งด้วยข้อความในแอปพลิเคชันของคุณด้วยแบบอักษรที่เลือกเพียงเพิ่ม<item name="android:fontfamily">@font/fontnamehere</item>ลงในของคุณstyles.xml


คุณควรจะขอบคุณคำตอบของฉันมากกว่า! :)
Dipali s
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.