จะเปลี่ยนแบบอักษรบน TextView ได้อย่างไร?


289

วิธีการเปลี่ยนแบบอักษรใน a TextViewเป็นค่าเริ่มต้นมันจะปรากฏเป็น Arial? จะเปลี่ยนเป็นHelveticaอย่างไร


1
ฉันคิดว่านี่เป็นคำถามซ้ำ ดูที่นี่สำหรับคำตอบstackoverflow.com/questions/2878882/android-develop-lcd-font/…
the100rabh

อาจเป็นลิงก์ของฉันที่เป็นประโยชน์สำหรับคุณstackoverflow.com/questions/2376250/…
duggu

คำตอบ:


342

ก่อนอื่นค่าเริ่มต้นไม่ใช่ Arial ค่าเริ่มต้นคือ Droid Sans

ประการที่สองเพื่อเปลี่ยนเป็นฟอนต์ในตัวแบบอื่นให้ใช้android:typefaceในเลย์เอาต์ XML หรือsetTypeface()ใน Java

ประการที่สามไม่มีตัวอักษร Helvetica ใน Android ตัวเลือกในตัว ได้แก่ Droid Sans ( sans), Droid Sans Mono ( monospace) และ Droid Serif ( serif) ในขณะที่คุณสามารถรวมฟอนต์ของคุณเองกับแอปพลิเคชันของคุณและใช้มันผ่านทางsetTypeface()โปรดจำไว้ว่าไฟล์ฟอนต์มีขนาดใหญ่และในบางกรณีจำเป็นต้องมีข้อตกลงสิทธิ์ใช้งาน (เช่นHelvetica, ฟอนต์ Linotype )

แก้ไข

ภาษาการออกแบบ Android นั้นอาศัยเครื่องมือการพิมพ์แบบดั้งเดิมเช่นขนาดพื้นที่จังหวะและการจัดแนวด้วยกริดพื้นฐาน การปรับใช้เครื่องมือเหล่านี้ให้ประสบความสำเร็จเป็นสิ่งจำเป็นเพื่อช่วยให้ผู้ใช้เข้าใจหน้าจอข้อมูลได้อย่างรวดเร็ว เพื่อสนับสนุนการใช้งานพิมพ์เช่น Ice Cream Sandwich ได้เปิดตัวตระกูล Roboto ใหม่ซึ่งได้รับการสร้างขึ้นเป็นพิเศษสำหรับความต้องการของ UI และหน้าจอความละเอียดสูง

เฟรมเวิร์ก TextView ปัจจุบันให้ Roboto ด้วยน้ำหนักแบบบางน้ำหนักเบาปกติและหนารวมถึงสไตล์ตัวเอียงสำหรับน้ำหนักแต่ละตัว เฟรมเวิร์กยังเสนอตัวแปรโรโบโต้แบบย่อในน้ำหนักแบบปกติและแบบหนาพร้อมกับสไตล์ตัวเอียงสำหรับน้ำหนักแต่ละตัว

หลังจาก ICS แล้ว Android จะรวมสไตล์ของแบบอักษร Roboto, อ่านเพิ่มเติมRoboto

แก้ไข 2

ด้วยการถือกำเนิดของ Support Library 26 ตอนนี้ Android รองรับแบบอักษรที่กำหนดเองตามค่าเริ่มต้น คุณสามารถแทรกแบบอักษรใหม่ในres / แบบอักษรซึ่งสามารถตั้งค่าเป็น TextViews ทีละรายการใน XML หรือโดยทางโปรแกรม ฟอนต์เริ่มต้นสำหรับแอปพลิเคชันทั้งหมดสามารถเปลี่ยนแปลงได้โดยกำหนดเป็นสไตล์.xmlเอกสารประกอบสำหรับนักพัฒนา android มีคำแนะนำที่ชัดเจนเกี่ยวกับเรื่องนี้ที่นี่


6
ไม่มีวิธีตั้งค่าแบบอักษรใน XML หรือไม่ ทำไม?
Jonny

5
@ จอนนี่จริงๆคุณทำได้ คุณกำลังสร้างคลาสที่ขยาย TextView และเรียก setTypeface จากนวกรรมิก
Mark Phillip

วิธีการทำในรูปแบบ XML?
M. Usman Khan

2
@usman: คุณจะต้องมีห้องสมุดบุคคลที่สามเช่น Calligraphy: github.com/chrisjenx/Calligraphy
CommonsWare

การตั้งค่าแบบอักษรโดยใช้รหัส java นั้นยากเนื่องจากมีหลายบรรทัดฉันได้สร้างไลบรารีเพื่อตั้งค่าแบบอักษรที่กำหนดเอง คุณสามารถค้นหาการใช้งานห้องสมุดในคำตอบนี้stackoverflow.com/a/42001474/4446392
Chathura Jayanath

254

ขั้นแรกให้ดาวน์โหลด.ttfไฟล์ของแบบอักษรที่คุณต้องการ ( arial.ttf) วางไว้ใน assets โฟลเดอร์ (โฟลเดอร์ทรัพย์สินภายในสร้างโฟลเดอร์ใหม่ชื่อแบบอักษรและวางไว้ข้างใน) ใช้รหัสต่อไปนี้เพื่อใช้แบบอักษรกับคุณTextView:

Typeface type = Typeface.createFromAsset(getAssets(),"fonts/arial.ttf"); 
textView.setTypeface(type);

เรียน Mayur คำแนะนำใด ๆ เกี่ยวกับตำแหน่งที่จะรับไฟล์. ttf เหล่านี้
lonelearner

3
เรียน @lonelearner คุณสามารถดาวน์โหลดไฟล์แบบอักษรฟรี (.ttf) ได้ที่1001freefonts.comหรือเพียงแค่ Google "Free fonts"
ymerdrengene

10
สำหรับผู้ที่ใช้ Android Studio และไม่พบโฟลเดอร์ "ทรัพย์สิน" ให้ดูคำถามนี้ คำตอบสั้น ๆ : src/main/assets/fonts/.
adamdport


33

คุณอาจต้องการสร้างคลาสแบบคงที่ซึ่งจะมีแบบอักษรทั้งหมด ด้วยวิธีนี้คุณจะไม่สร้างแบบอักษรหลายครั้งซึ่งอาจส่งผลเสียต่อประสิทธิภาพการทำงาน เพียงตรวจสอบให้แน่ใจว่าคุณสร้างโฟลเดอร์ย่อยที่เรียกว่า " แบบอักษร " ภายใต้โฟลเดอร์ " สินทรัพย์ "

ทำสิ่งที่ชอบ:

public class CustomFontsLoader {

public static final int FONT_NAME_1 =   0;
public static final int FONT_NAME_2 =   1;
public static final int FONT_NAME_3 =   2;

private static final int NUM_OF_CUSTOM_FONTS = 3;

private static boolean fontsLoaded = false;

private static Typeface[] fonts = new Typeface[3];

private static String[] fontPath = {
    "fonts/FONT_NAME_1.ttf",
    "fonts/FONT_NAME_2.ttf",
    "fonts/FONT_NAME_3.ttf"
};


/**
 * Returns a loaded custom font based on it's identifier. 
 * 
 * @param context - the current context
 * @param fontIdentifier = the identifier of the requested font
 * 
 * @return Typeface object of the requested font.
 */
public static Typeface getTypeface(Context context, int fontIdentifier) {
    if (!fontsLoaded) {
        loadFonts(context);
    }
    return fonts[fontIdentifier];
}


private static void loadFonts(Context context) {
    for (int i = 0; i < NUM_OF_CUSTOM_FONTS; i++) {
        fonts[i] = Typeface.createFromAsset(context.getAssets(), fontPath[i]);
    }
    fontsLoaded = true;

}
}

ด้วยวิธีนี้คุณสามารถรับแบบอักษรได้จากทุกที่ในแอปพลิเคชันของคุณ


1
เพื่อนที่น่ากลัว! นี่คือความงามของ OOP การทำงานที่ดี! :)
Joshua Michael Wagoner

ฉันจะใช้คลาสนี้ได้อย่างไร
แจ็ค

คุณต้องวางรหัสนี้ในโครงการของคุณปรับให้เข้ากับแบบอักษรของคุณแล้วใช้ getTypeface (.. ) วิธีการคงที่จากที่ใดก็ได้ในแอปของคุณ
Daniel L.

ฉันใช้โซลูชันที่คล้ายกัน แต่เพิ่มการแคชเพื่อปรับปรุงประสิทธิภาพ .... ไม่ว่าในกรณีใดคุณพบสถานการณ์ที่ตัวอักษรใช้งานได้ในโทรศัพท์บางรุ่น
RJFares

20

แนวปฏิบัติที่ดีที่สุดเลยทีเดียว

TextViewPlus.java:

public class TextViewPlus extends TextView {
    private static final String TAG = "TextView";

    public TextViewPlus(Context context) {
        super(context);
    }

    public TextViewPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setCustomFont(context, attrs);
    }

    private void setCustomFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
        String customFont = a.getString(R.styleable.TextViewPlus_customFont);
        setCustomFont(ctx, customFont);
        a.recycle();
    }

    public boolean setCustomFont(Context ctx, String asset) {
        Typeface typeface = null;
        try {
            typeface = Typeface.createFromAsset(ctx.getAssets(), asset);
        } catch (Exception e) {
            Log.e(TAG, "Unable to load typeface: "+e.getMessage());
            return false;
        }

        setTypeface(typeface);
        return true;
    }
}

attrs.xml: (ตำแหน่งที่จะวางres / values )

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

วิธีใช้:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:foo="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.mypackage.TextViewPlus
        android:id="@+id/textViewPlus1"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:text="@string/showingOffTheNewTypeface"
        foo:customFont="my_font_name_regular.otf">
    </com.mypackage.TextViewPlus>
</LinearLayout>

หวังว่านี่จะช่วยคุณได้


1
ทำไมการ subclassing TextView จึงเป็นแนวปฏิบัติที่ดีที่สุด
Stealth Rabbi

@ Stealth Rabbi ที่นี่เราสามารถส่งแบบอักษรที่กำหนดเองโดย xml เท่านั้นไม่จำเป็นต้องเขียนโค้ด java พิเศษสำหรับแต่ละ textview
Hiren Patel

มีห้องสมุดสำหรับสิ่งนั้น เพียงเพิ่มแบบอักษรของคุณในโฟลเดอร์ทรัพย์สินและประกาศเป็นแบบ XML github.com/febaisi/CustomTextView
febaisi

ห้องสมุดของคุณดูดี แต่ปัญหาเดียวก็คือสำหรับ Android 21+
loloof64

@febaisi ตามที่ฉันเห็นในตัวอย่าง lib ของคุณraw.githubusercontent.com/febaisi/CustomTextView/master/wiki/…
Mr.Q

17

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


1
ความคิดเห็นของคุณซ้ำซ้อน คำอธิบายข้างต้นพูดตรงตามที่คุณพูดและอื่น ๆ ...
Joshua Michael Wagoner

14

อีกวิธีในการรวมการสร้างแบบอักษร ...

public class Font {
  public static final Font  PROXIMA_NOVA    = new Font("ProximaNovaRegular.otf");
  public static final Font  FRANKLIN_GOTHIC = new Font("FranklinGothicURWBoo.ttf");
  private final String      assetName;
  private volatile Typeface typeface;

  private Font(String assetName) {
    this.assetName = assetName;
  }

  public void apply(Context context, TextView textView) {
    if (typeface == null) {
      synchronized (this) {
        if (typeface == null) {
          typeface = Typeface.createFromAsset(context.getAssets(), assetName);
        }
      }
    }
    textView.setTypeface(typeface);
  }
}

และเพื่อใช้ในกิจกรรมของคุณ ...

myTextView = (TextView) findViewById(R.id.myTextView);
Font.PROXIMA_NOVA.apply(this, myTextView);

โปรดทราบว่าสำนวนการล็อคที่มีการตรวจสอบซ้ำสองครั้งนี้จะมีการทำงานอย่างถูกต้องกับรุ่นหน่วยความจำที่ใช้ใน Java 1.5+


ทำไมคำตอบนี้มีเพียง 1 upvote เท่านั้นและคำตอบข้างบนมี 15? อะไรที่ทำให้อีกคนหนึ่งดีขึ้น? ดูเหมือนว่าฉันคนนี้ตรงไปตรงมามากขึ้นโดยใช้หลักการซิงเกิล ... ?
Koen Demonie

เพิ่งเห็นว่าคุณมีคอนสตรัคท์ของคุณฉันจะทำให้เป็นส่วนตัวเพราะคุณไม่จำเป็นต้องใช้มัน คุณกำลังใช้ตัวอักษรภายในของคุณ vars anyways ...
Koen Demonie

ควรเป็นผู้สร้างส่วนตัว ด่างดี :) จะแก้ไข!
Chris Aitchison

12

แนวทางปฏิบัติที่ดีที่สุดคือการใช้ Android Support Library เวอร์ชัน 26.0.0 หรือสูงกว่า

ขั้นตอนที่ 1: เพิ่มไฟล์ตัวอักษร

  1. ในโฟลเดอร์resสร้างแบบอักษรใหม่พจนานุกรมทรัพยากร
  2. เพิ่มไฟล์ฟอนต์ ( .ttf , .orf )

ตัวอย่างเช่นเมื่อไฟล์ฟอนต์จะเป็น helvetica_neue.ttf ที่จะสร้าง R.font.helvetica_neue

ขั้นตอนที่ 2: สร้างตระกูลแบบอักษร

  1. ในแบบอักษรโฟลเดอร์เพิ่มไฟล์ทรัพยากรใหม่
  2. ใส่แต่ละไฟล์ฟอนต์สไตล์และแอตทริบิวต์ของน้ำหนักในองค์ประกอบ

ตัวอย่างเช่น:

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
        android:fontStyle="normal"
        android:fontWeight="400"
        android:font="@font/helvetica_neue" />
</font-family>

ขั้นตอนที่ 3: ใช้

ในรูปแบบ xml:

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

หรือเพิ่มแบบอักษรในสไตล์:

<style name="customfontstyle" parent="@android:style/TextAppearance.Small">
    <item name="android:fontFamily">@font/lobster</item>
</style>

สำหรับตัวอย่างเพิ่มเติมคุณสามารถทำตามเอกสาร:

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


7

มันเก่าไปหน่อย แต่ฉันปรับปรุง CustomFontLoader ของชั้นหน่อยแล้วฉันก็อยากจะแบ่งปันมันดังนั้นมันจึงมีประโยชน์ เพียงแค่สร้างคลาสใหม่ด้วยรหัสนี้

 import android.content.Context;
 import android.graphics.Typeface;

public enum FontLoader {

ARIAL("arial"),
TIMES("times"),
VERDANA("verdana"),
TREBUCHET("trbuchet"),
GEORGIA("georgia"),
GENEVA("geneva"),
SANS("sans"),
COURIER("courier"),
TAHOMA("tahoma"),
LUCIDA("lucida");   


private final String name;
private Typeface typeFace;


private FontLoader(final String name) {
    this.name = name;

    typeFace=null;  
}

public static Typeface getTypeFace(Context context,String name){
    try {
        FontLoader item=FontLoader.valueOf(name.toUpperCase(Locale.getDefault()));
        if(item.typeFace==null){                
            item.typeFace=Typeface.createFromAsset(context.getAssets(), "fonts/"+item.name+".ttf");                 
        }           
        return item.typeFace;
    } catch (Exception e) {         
        return null;
    }                   
}
public static Typeface getTypeFace(Context context,int id){
    FontLoader myArray[]= FontLoader.values();
    if(!(id<myArray.length)){           
        return null;
    } 
    try {
        if(myArray[id].typeFace==null){     
            myArray[id].typeFace=Typeface.createFromAsset(context.getAssets(), "fonts/"+myArray[id].name+".ttf");                       
        }       
        return myArray[id].typeFace;    
    }catch (Exception e) {          
        return null;
    }   

}

public static Typeface getTypeFaceByName(Context context,String name){      
    for(FontLoader item: FontLoader.values()){              
        if(name.equalsIgnoreCase(item.name)){
            if(item.typeFace==null){
                try{
                    item.typeFace=Typeface.createFromAsset(context.getAssets(), "fonts/"+item.name+".ttf");     
                }catch (Exception e) {          
                    return null;
                }   
            }
            return item.typeFace;
        }               
    }
    return null;
}   

public static void loadAllFonts(Context context){       
    for(FontLoader item: FontLoader.values()){              
        if(item.typeFace==null){
            try{
                item.typeFace=Typeface.createFromAsset(context.getAssets(), "fonts/"+item.name+".ttf");     
            }catch (Exception e) {
                item.typeFace=null;
            }   
        }                
    }       
}   
}

จากนั้นใช้โค้ดนี้กับข้อความที่คุณดู:

 Typeface typeFace=FontLoader.getTypeFace(context,"arial");  
 if(typeFace!=null) myTextView.setTypeface(typeFace);

5

ในที่สุดฉันก็ได้คำตอบที่ง่ายมากสำหรับเรื่องนี้

  1. ใช้ห้องสมุดการสนับสนุนเหล่านี้ในระดับแอป gradle ,

    compile 'com.android.support:appcompat-v7:26.0.2'
    compile 'com.android.support:support-v4:26.0.2'
  2. จากนั้นสร้างไดเรกทอรีชื่อ"font"ภายในโฟลเดอร์res

  3. ใส่ไฟล์แบบอักษร (ttf) ลงในไดเรกทอรีแบบอักษรนั้นโปรดจำไว้ว่าแบบแผนการตั้งชื่อ [egname ไม่ควรมีตัวอักษรพิเศษใด ๆ ตัวอักษรตัวพิมพ์ใหญ่และช่องว่างหรือแท็บใด ๆ ]
  4. หลังจากนั้นอ้างอิงแบบอักษรนั้นจากxmlเช่นนี้

            <Button
            android:id="@+id/btn_choose_employee"
            android:layout_width="140dp"
            android:layout_height="40dp"
            android:layout_centerInParent="true"
            android:background="@drawable/rounded_red_btn"
            android:onClick="btnEmployeeClickedAction"
            android:text="@string/searching_jobs"
            android:textAllCaps="false"
            android:textColor="@color/white"
            android:fontFamily="@font/times_new_roman_test"
            />

ในตัวอย่างนี้times_new_roman_testเป็นไฟล์ฟอนต์ ttf จากไดเร็กทอรีฟอนต์นั้น


4
import java.lang.ref.WeakReference;
import java.util.HashMap;

import android.content.Context;
import android.graphics.Typeface;

public class FontsManager {

    private static FontsManager instance;

    private static HashMap<String, WeakReference<Typeface>> typefaces = new HashMap<String, WeakReference<Typeface>>();

    private static Context context;

    private FontsManager(final Context ctx) {
        if (context == null) {
            context = ctx;
        }
    }

    public static FontsManager getInstance(final Context appContext) {
        if (instance == null) {
            instance = new FontsManager(appContext);
        }
        return instance;
    }

    public static FontsManager getInstance() {
        if (instance == null) {
            throw new RuntimeException(
                    "Call getInstance(Context context) at least once to init the singleton properly");
        }
        return instance;
    }

    public Typeface getFont(final String assetName) {
        final WeakReference<Typeface> tfReference = typefaces.get(assetName);
        if (tfReference == null || tfReference.get() == null) {
            final Typeface tf = Typeface.createFromAsset(context.getResources().getAssets(),
                    assetName);
            typefaces.put(assetName, new WeakReference<Typeface>(tf));
            return tf;
        }
        return tfReference.get();
    }

}

ด้วยวิธีนี้คุณสามารถสร้างมุมมองที่สืบทอดจาก TextView และการเรียก setTypeface บนตัวสร้าง


1
สวัสดีทำไม WeakReference ถึงถือวัตถุ TypeFace?
Lazy

3

เมื่อตัวอักษรของคุณถูกเก็บไว้ภายในres/asset/fonts/Helvetica.ttfใช้ต่อไปนี้:

Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/Helvetica.ttf"); 
txt.setTypeface(tf);

หรือหากไฟล์ฟอนต์ของคุณเก็บไว้ภายในให้res/font/helvetica.ttfใช้สิ่งต่อไปนี้:

Typeface tf = ResourcesCompat.getFont(this,R.font.helvetica);
txt.setTypeface(tf);

2
ขอบคุณกำลังมองหาส่วนที่คุณมีในโฟลเดอร์ res!
Mikkel Larsen

2

รับแบบอักษรจากเนื้อหาและตั้งค่าให้กับเด็กทุกคน

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(Typeface.createFromAsset(context.getAssets(),"DroidNaskh.ttf"));// "BKOODB.TTF"));
        }
    } catch (Exception e) {
 }
 } 

2
  1. เพิ่มคลาส FontTextView.java:


public class FontTextView extends TextView {
    String fonts[] = {"HelveticaNeue.ttf", "HelveticaNeueLight.ttf", "motschcc.ttf", "symbol.ttf"};

    public FontTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs);
    }

    public FontTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        if (!isInEditMode()) {
            init(attrs);
        }

    }

    public FontTextView(Context context) {
        super(context);
        if (!isInEditMode()) {
            init(null);
        }
    }

    private void init(AttributeSet attrs) {
        if (attrs != null) {
            TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.FontTextView);
            if (a.getString(R.styleable.FontTextView_font_type) != null) {
                String fontName = fonts[Integer.valueOf(a.getString(R.styleable.FontTextView_font_type))];

                if (fontName != null) {
                    Typeface myTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/" + fontName);
                    setTypeface(myTypeface);
                }
                a.recycle();
            }
        }
    }
}


  1. เพิ่มลงในฟอนต์ไลบรารีสินทรัพย์
    ป้อนคำอธิบายรูปภาพที่นี่


  1. เพิ่มใน attrs.xml ตัวเลขควรอยู่ในลำดับในคลาสอาเรย์

    <declare-styleable name="FontTextView">
    <attr name="font_type" format="enum">
        <enum name="HelveticaNeue" value="0"/>
        <enum name="HelveticaNeueLight" value="1"/>
        <enum name="motschcc" value="2"/>
        <enum name="symbol" value="3"/>
    </attr>


  1. เลือกแบบอักษรจากรายการ
    ป้อนคำอธิบายรูปภาพที่นี่

คุณจำเป็นต้องยกตัวอย่างคลาสนี้ใน MainActivity หรือไม่? เพราะมันไม่ได้เปลี่ยนแปลงอะไรสำหรับฉัน
Tobias Mayr

1

Android ใช้แบบอักษร Roboto ซึ่งเป็นแบบอักษรที่ดูดีจริง ๆ ด้วยน้ำหนักที่แตกต่างกันหลายประการ (ปกติเบาบางข้น) ที่ดูดีบนหน้าจอที่มีความหนาแน่นสูง

ลิงค์ด้านล่างเพื่อตรวจสอบแบบอักษร roboto:

วิธีใช้ Roboto ในรูปแบบ xml

กลับไปที่คำถามของคุณหากคุณต้องการเปลี่ยนแบบอักษรสำหรับTextView / Button ทั้งหมดในแอปของคุณลองเพิ่มรหัสด้านล่างลงใน styles.xml ของคุณเพื่อใช้แบบอักษรRoboto-light :

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    ......
    <item name="android:buttonStyle">@style/MyButton</item>
    <item name="android:textViewStyle">@style/MyTextView</item>
</style>

<style name="MyButton" parent="@style/Widget.AppCompat.Button">
    <item name="android:textAllCaps">false</item>
    <item name="android:fontFamily">sans-serif-light</item>
</style>

<style name="MyTextView" parent="@style/TextAppearance.AppCompat">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

และอย่าลืมใช้ 'AppTheme' ใน AndroidManifest.xml ของคุณ

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    ......
</application>

0

อาจจะง่ายกว่านี้หน่อย:

public class Fonts {
  public static HashSet<String,Typeface> fonts = new HashSet<>();

  public static Typeface get(Context context, String file) {
    if (! fonts.contains(file)) {
      synchronized (this) {
        Typeface typeface = Typeface.createFromAsset(context.getAssets(), name);
        fonts.put(name, typeface);
      }
    }
    return fonts.get(file);
  }
}

// Usage
Typeface myFont = Fonts.get("arial.ttf");

(โปรดทราบว่ารหัสนี้ยังไม่ได้ทดสอบ แต่โดยทั่วไปวิธีนี้ควรใช้งานได้ดี)

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