Özel yazı tipleri ve XML düzenleri (Android)


174

Android'de XML dosyalarını kullanarak bir GUI düzeni tanımlamaya çalışıyorum. Bildiğim kadarıyla, widget'larınızın XML dosyalarında özel bir yazı tipi (örneğin, varlık / yazı tipi / içine yerleştirdiğiniz bir yazı tipi) kullanması gerektiğini belirtmenin bir yolu yoktur ve yalnızca sistem yüklü yazı tiplerini kullanabilirsiniz.

Java kodunda, benzersiz kimlikler kullanarak her widget'ın yazı tipini manuel olarak değiştirebileceğimi biliyorum. Alternatif olarak, bu değişikliği yapmak için Java'daki tüm widget'ları yineleyebilirim, ancak bu muhtemelen çok yavaş olacaktır.

Başka hangi seçeneklerim var? Özel bir görünüme sahip widget'lar yapmanın daha iyi yolları var mı? Eklediğim her yeni widget için yazı tipini manuel olarak değiştirmek zorunda kalmak istemiyorum.


68
DrDefrost - lütfen bazı cevapları kabul edin, bu sitede daha fazla yanıt alacaksınız.
SK9

1
Benzer bir soru daha var: stackoverflow.com/questions/9030204/…
Vins

Güncellendi 05/2017: "Destek Kitaplığı 26.0 Beta, Android API sürüm 14 ve sonraki sürümlerini çalıştıran cihazlarda XML'deki Yazı Tipleri özelliğini destekler." Bakınız: developer.android.com/preview/features/…
albert c braun

Yanıtlar:


220

Burada öğrendiğim gibi özel yazı tiplerini ayarlamak için TextView'i genişletebilirsiniz .

TextViewPlus.java:

package com.example;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

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 tf = null;
        try {
        tf = Typeface.createFromAsset(ctx.getAssets(), asset);  
        } catch (Exception e) {
            Log.e(TAG, "Could not get typeface: "+e.getMessage());
            return false;
        }

        setTypeface(tf);  
        return true;
    }

}

attrs.xml: (res / değer cinsinden )

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

main.xml:

<?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/com.example"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.example.TextViewPlus
        android:id="@+id/textViewPlus1"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:text="@string/showingOffTheNewTypeface"
        foo:customFont="saxmono.ttf">
    </com.example.TextViewPlus>
</LinearLayout>

Varlıklar klasörüne "saxmono.ttf" koyardınız .

GÜNCELLEME 8/1/13

Bu yöntemle ilgili ciddi bellek endişeleri var. Aşağıdaki chedabob'un yorumuna bakın.


5
Bu güzel görünüyor, ancak main.xml içinde "TextViewPlus" kullanmaya çalıştığınızda bir hata alıyorum. Aşağıdakileri alıyorum: - hata: XML ayrıştırma hatası: unbound öneki - "supportLibs.TextViewPlus" öğe türüyle ilişkili "foo: customFont" özniteliği için "foo" öneki bağlı değildir.
Majjoodi

79
Unutulmaması gereken bir şey, bunun onlarca ve onlarca TypeFace nesnesi üreteceği ve hafızayı yiyeceği. 4.0 öncesi Android'de TypeFaces'i düzgün bir şekilde serbest bırakmayan bir hata var. Yapılacak en kolay şey HashMap ile bir TypeFace önbellek oluşturmaktır. Bu benim app bellek kullanımını 120+ mb 18mb aşağı getirdi. code.google.com/p/android/issues/detail?id=9904
chedabob

7
@Majjoodi: Bu genellikle düzeninize 2. ad alanını eklemeyi unutursanız olur:xmlns:foo="http://schemas.android.com/apk/res/com.example
Theo

11
ÇOK ÖNEMLİ - Sadece stres chedabob'un tavsiyesini iki katına çıkarmak istiyorum. Takip etmedikçe, ICS öncesi bir bellek sızıntısına sahip olacaksınız. Birkaç çözüm var, bunlardan biri chedabob tarafından sağlanan bağlantıda, diğeri burada: stackoverflow.com/questions/8057010/listview-memory-leak . peter - lütfen cevabınızı güncelleyin - harika ama tam değil
Michał K

1
Genişlik ve yükseklik gibi diğer metin görünümü özelliklerine ek olarak styles.xml dosyasında bu özel özelliği nasıl ayarlarım?
loeschg

35

Partiye 3 yıl geç kaldım :( Ancak bu yazıya rastlayabilecek biri için yararlı olabilir.

Yazı tiplerini önbelleğe alan ve XML'den özel yazı karakterleri belirtmenize izin veren bir kitaplık yazdım. Kütüphaneyi burada bulabilirsiniz .

XML düzeninizi kullandığınızda şöyle görünecektir.

<com.mobsandgeeks.ui.TypefaceTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world"
    geekui:customTypeface="fonts/custom_font.ttf" />

Hey @ Ragunath-jawahar, bir gradle projesi için kütüphaneyi nasıl alabilirim? Denedim compile 'com.mobsandgeeks:android-typeface-textview:1.0'ama işe yaramadı.
aimango

1
Bu şekilde kullanabilmek için bir AAR'ye ihtiyacınız olacak. Henüz orada değil. Şimdilik kaynakları kopyalayabilir ve bir Android Studio Kitaplığı projesi oluşturabilirsiniz.
Ragunath Jawahar

2
geekui etiketiniz nereden geliyor?
sefirosu

3
Üst etikette belirtilen ad alanından -xmlns:geekui="http://schemas.android.com/apk/res-auto"
Ragunath Jawahar

1
@MuhammedRefaat, evet öyle :)
Ragunath Jawahar

18

Bu biraz geç olabilir, ancak bellek sızıntılarını önlemek için özel yazı tipini döndüren tek bir sınıf oluşturmanız gerekir.

TypeFace sınıfı:

public class OpenSans {

private static OpenSans instance;
private static Typeface typeface;

public static OpenSans getInstance(Context context) {
    synchronized (OpenSans.class) {
        if (instance == null) {
            instance = new OpenSans();
            typeface = Typeface.createFromAsset(context.getResources().getAssets(), "open_sans.ttf");
        }
        return instance;
    }
}

public Typeface getTypeFace() {
    return typeface;
}
}

Özel TextView:

public class NativelyCustomTextView extends TextView {

    public NativelyCustomTextView(Context context) {
        super(context);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

}

Xml tarafından:

<com.yourpackage.views.NativelyCustomTextView
            android:id="@+id/natively_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_margin="20dp"
            android:text="@string/natively"
            android:textSize="30sp" /> 

Programlı:

TextView programmaticallyTextView = (TextView) 
       findViewById(R.id.programmatically_text_view);

programmaticallyTextView.setTypeface(OpenSans.getInstance(this)
                .getTypeFace());

Çalışma zamanında çalışıyor gibi görünüyor, ancak tasarımcıda da çalışması gerekiyor mu?
Magnus Johansson

Elbette. Xml olarak kullanabilirsiniz. Magnus
Leonardo Cardoso

Yanlış anladığınızı düşünüyorum, Tasarım zamanında işe yaramadı (Tasarımcı önizlemesi). (xml! = tasarımcı). Çalışma zamanında derlenmiş Xml düzen dosyasında belirtilen iyi çalışıyor. Her neyse, ihtiyaçlarım için çok daha iyi çalışan bu uzantıyı github.com/danh32/Fontify kullanıyorum (birden çok yazı tipi stilini, normal, kalın vb. Yanı sıra farklı yazı tipi adlarını ve TextView dışındaki diğer kontrolleri destekler)
Magnus Johansson

2
GetTypeFace her çağrıda yeni bir yazı biçimi oluşturur ... bu, singletonun amacını bozar. Arama ilk kez yapıldığında ayarlanan ve sonraki aramalarda alanın değerini döndüren statik bir alana sahip olmalıdır.
Steven Pena

1
@chiwai haklısın! İlk soru hakkında buna ihtiyacı yok. İkincisi ise bir yazım hatasıydı.
Leonardo Cardoso

13

Eski bir soru, ama eminim iyi bir çözüm arayışına başlamadan önce bu cevabı burada okudum. Kaligrafiandroid:fontFamily , varlık klasörünüzdeki özel yazı tipleri için destek eklemek üzere özelliği şu şekilde genişletir :

<TextView 
  android:text="@string/hello_world"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:fontFamily="fonts/Roboto-Bold.ttf"/>

Etkinleştirmek için yapmanız gereken tek şey, onu kullandığınız Aktivitenin Bağlamına eklemektir:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(new CalligraphyContextWrapper(newBase));
}

Değiştirilecek kendi özel özelliğinizi de belirtebilirsiniz android:fontFamily

Ayrıca, AppTheme dahil olmak üzere temalarda da çalışır.


8

DataBinding kullanma :

@BindingAdapter({"bind:font"})
public static void setFont(TextView textView, String fontName){
 textView.setTypeface(Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/" + fontName));
}

XML'de:

<TextView
app:font="@{`Source-Sans-Pro-Regular.ttf`}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

yazı tipi dosyası assets/fonts/


7

Eklemek istediğiniz yalnızca bir yazı tipiniz varsa ve daha az kod yazmak istiyorsanız, özel yazı tipiniz için özel bir TextView oluşturabilirsiniz. Aşağıdaki koda bakınız.

package com.yourpackage;
import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

public class FontTextView extends TextView {
    public static Typeface FONT_NAME;


    public FontTextView(Context context) {
        super(context);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
}

Main.xml dosyasında artık textView öğenizi şu şekilde ekleyebilirsiniz:

<com.yourpackage.FontTextView
    android:id="@+id/tvTimer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="" />

bunu init () üzerinde yapın ve kendinize aynı çağrıyı 3 kat kaydedin.
ericosg

@ericosg bu çözümü kullandığımda bu hatayı alıyorum android.view.InflateException: İkili XML dosya satırı # 9: com.ascent.adwad.utils.CustomTextView
Sagar Devanga

@SagarDevanga, daha fazla bilgi olmadan yardım etmek zor. Belki olabildiğince uzağa götürün ve yeni bir soru sorun.
ericosg

7

Bunu yapmanın en iyi yolu Android O önizleme sürümünden bu şekilde
1.) res klasörünü sağ tıklayın ve Yeni> Android kaynak dizinine gidin . Yeni
Kaynak Dizini penceresi görünür.
2.) Kaynak türü listesinde yazı tipini seçin ve Tamam'ı tıklatın.
3.) Yazı tipi dosyalarınızı yazı tipi klasörüne ekleyin . Aşağıdaki klasör yapısı R.font.dancing_script, R.font.la_la ve R.font.ba_ba üretir.
4.) Düzenleyicide dosyanın yazı tiplerini önizlemek için bir yazı tipi dosyasına çift ​​tıklayın .

Sonra bir font ailesi oluşturmalıyız

1.) Yazı tipi klasörünü sağ tıklayın ve Yeni> Yazı tipi kaynak dosyası'na gidin . Yeni Kaynak Dosyası penceresi görünür.
2.) Dosya adını girin ve Tamam'ı tıklatın . Yeni font kaynak XML'i editörde açılır.
3.) Yazı tipi etiketi öğesine her bir yazı tipi dosyasını, stilini ve ağırlık özelliğini ekleyin. Aşağıdaki XML, font kaynağı XML'sine fontla ilgili özniteliklerin eklenmesini gösterir:

<?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/hey_regular" />
    <font
    android:fontStyle="italic"
    android:fontWeight="400"
    android:font="@font/hey_bababa" />
</font-family>

Bir TextView'e yazı tipi ekleme:

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

Dokümantasyondan itibaren

Yazı Tipleriyle Çalışma

tüm adımlar doğrudur.


1
En iyi cevap! Yazı tipi dosya adı küçük harf olmalıdır.
Dmitry

Ayrıca, uygulamanıza uyguladığınız (AndroidManifest dosyasının altında) özel bir stil de oluşturabilirsiniz ve stil TÜM görünümlere verilecektir. Örneğin, tek bir TextView üzerine yerleştirmek yerine, Araç Çubuğunu etkilemeyecektir.
goldenmaza

5

Uzatın TextViewve özel bir özellik verin veya kullanmak istediğiniz yazı tipinin bir Dizesini geçirmek için android: tag niteliğini kullanın. TextView sınıfınızın onları nerede bulacağını bilmesi için tüm fontlarımı res / asset / fonts / klasörüne koyacağım gibi bir kural seçip ona bağlı kalmanız gerekir. Sonra yapıcıda sadece süper çağrıdan sonra yazı tipini manuel olarak ayarladınız.


4

Özel yazı tiplerini kullanmanın tek yolu kaynak kodudur.

Android'in çok sınırlı kaynaklara ve yazı tiplerine sahip cihazlarda çalıştığını unutmayın, iyi miktarda RAM gerektirebilir. Yerleşik Droid yazı tipleri özel olarak üretilmiştir ve not ederseniz birçok karakter ve dekorasyon eksiktir.


"Android'in çok sınırlı kaynaklara sahip cihazlarda çalıştığını unutmayın" -> bu durum gittikçe azalıyor. Dört çekirdekli telefon? Gerçekten mi??
Sandy

9
Yorumunuzu iyi bir buçuk yıl öncesine dayanan tareqHs cevabının bağlamını göz önünde bulundurmak için daha fazlasını yapardım.
SK9

Cevabınızın ilk kısmı 2010'da cevabınızı yazarken doğru olabilir. Android'de tipografide seçim eksikliği bir özellik değil, bir kusurdur; iOS, 2008'den bu yana ilkel cihazlar altında geliştiricilere günümüz standartlarına göre birden fazla yazı tipi sunmaktadır.
cosmix

Bu cevap artık geçerli değil.
Martin Konecny

2

TextView genişletmeden ve uzun bir kod uygulamadan soru için basit bir cevap olabilir.

Kod:

 TextView tv = (TextView) findViewById(R.id.textview1);
    tv.setTypeface(Typeface.createFromAsset(getAssets(), "font.ttf"));

Özel yazı tipi dosyasını her zamanki gibi varlıklar klasörüne yerleştirin ve bunu deneyin. Benim için çalışıyor. Peter'ın bu basit şey için neden bu kadar büyük bir kod verdiğini ya da eski versiyonda cevabını verdiğini anlamıyorum.


2

Özel sınıflar oluşturmadan xml'de de tanımlanabilir

style.xml

<style name="ionicons" parent="android:TextAppearance">
    <!-- Custom Attr-->
    <item name="fontPath">fonts/ionicons.ttf</item>
</style>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="@style/ionicons"
        android:text=""/>
</LinearLayout>

Hızlı bir not, çünkü her zaman yazı tiplerini nereye koyacağımı unuttum, yazı tipinin içinde olması gerekiyor assetsve bu klasör aynı seviyede bulunuyor resve srcbenim durumumdaassets/fonts/ionicons.ttf

Güncelleme bu yöntem gerektiğinden eklendi kök düzenini xmlns:app="http://schemas.android.com/apk/res-auto"çalışmaya

Güncelleme 2 Daha önce Kaligrafi adı verilen bir kütüphaneyi unuttum


Bu benim için işe yaramıyor. Bunu oluşturmaya çalıştığımda hata iletisini alıyorum: Hata: (49, 5) Verilen adla eşleşen kaynak bulunamadı: attr 'fontPath'.
Stef

xmlns:app="http://schemas.android.com/apk/res-auto"Kök düzeninize eklemeyi deneyin , güncellenmiş yanıtı da kontrol edin
norman784

Hata, düzen XML dosyasından değil, stil XML dosyasından gelir. Bir fontPath'in ne olduğunu 'bilmiyor' gibi görünüyor.
Stef

Hakkınız, Calligrapy adlı bir kütüphanem olduğunu unuttum
norman784

1

Peter'ın cevabı en iyisidir, ancak yazı tiplerini uygulamanızdaki tüm metin görünümleri için özelleştirmek üzere Android'den styles.xml kullanılarak geliştirilebilir.

Kodum burada


1

Yazı tiplerini özelleştirmenin iki yolu vardır:

!!! varlıklar / fontlar / iran_sans.ttf içindeki özel yazı tipim

Yol 1: Refrection Typeface.class |||en iyi yol

Sınıfta FontsOverride.setDefaultFont () yöntemini çağırır Uygulamayı genişletir, Bu kod, Toasts fontları bile dahil olmak üzere tüm yazılım fontlarının değiştirilmesine neden olur

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. Yol: setTypeface kullanın

özel görünüm için yazı tipini değiştirmek için setTypeface () öğesini çağırmanız yeterlidir.

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

Kolayca özel textview sınıfı yapabilirsiniz: -

İlk önce yapmanız gerekenler Custom textviewile genişletilmiş sınıf yapın AppCompatTextView.

public class CustomTextView extends AppCompatTextView {
    private int mFont = FontUtils.FONTS_NORMAL;
    boolean fontApplied;

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

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs, context);
    }

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

    protected void init(AttributeSet attrs, Context cxt) {
        if (!fontApplied) {
            if (attrs != null) {
                mFont = attrs.getAttributeIntValue(
                        "http://schemas.android.com/apk/res-auto", "Lato-Regular.ttf",
                        -1);
            }
            Typeface typeface = getTypeface();
            int typefaceStyle = Typeface.NORMAL;
            if (typeface != null) {
                typefaceStyle = typeface.getStyle();
            }
            if (mFont > FontUtils.FONTS) {
                typefaceStyle = mFont;
            }
            FontUtils.applyFont(this, typefaceStyle);
            fontApplied = true;
        }
    }
}

Şimdi, her zaman Özel metin görünümü çağrı ve öznitelik int değeri alırsınız int fontValue = attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto","Lato-Regular.ttf",-1).

Veya

Ayrıca xml ( android:textStyle="bold|normal|italic") içinde ayarladığımız görünümden getTypeface () yöntemini de alabiliriz . Öyleyse yapmak istediğinizi yapın.

Şimdi, FontUtilsherhangi bir .ttf yazı tipini görünümümüze ayarlamak için yapıyoruz .

public class FontUtils {

    public static final int FONTS = 1;
    public static final int FONTS_NORMAL = 2;
    public static final int FONTS_BOLD = 3;
    public static final int FONTS_BOLD1 = 4;

    private static Map<String, Typeface> TYPEFACE = new HashMap<String, Typeface>();

    static Typeface getFonts(Context context, String name) {
        Typeface typeface = TYPEFACE.get(name);
        if (typeface == null) {
            typeface = Typeface.createFromAsset(context.getAssets(), name);
            TYPEFACE.put(name, typeface);
        }
        return typeface;
    }

    public static void applyFont(TextView tv, int typefaceStyle) {

        Context cxt = tv.getContext();
        Typeface typeface;

        if(typefaceStyle == Typeface.BOLD_ITALIC) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
        }else if (typefaceStyle == Typeface.BOLD || typefaceStyle == SD_FONTS_BOLD|| typefaceStyle == FONTS_BOLD1) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-SemiBold.ttf");
        } else if (typefaceStyle == Typeface.ITALIC) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Thin.ttf");
        } else {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
        }
        if (typeface != null) {
            tv.setTypeface(typeface);
        }
    }
}

0

Android 8.0'dan (API düzey 26) başlayarak XML'de özel bir yazı tipi kullanabileceğinizi bilmek yararlı olabilir .

Uygulamanın tamamına aşağıdaki şekilde özel bir yazı tipi uygulayabilirsiniz.

  1. Yazı tipini klasöre yerleştirin res/font.

  2. In res/values/styles.xmluygulama tema kullanılmak buna. <style name="AppTheme" parent="{whatever you like}"> <item name="android:fontFamily">@font/myfont</item> </style>



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.