Tüm Android uygulaması için varsayılan yazı tipi ailesi nasıl ayarlanır?


282

Uygulamamda Roboto ışık yazı tipini kullanıyorum. Yazı tipini ayarlamak android:fontFamily="sans-serif-light"için her görünüme eklemem gerekir . Roboto yazı tipini uygulamanın tamamına varsayılan yazı tipi ailesi olarak bildirmenin bir yolu var mı? Ben böyle denedim ama işe yaramadı.

<style name="AppBaseTheme" parent="android:Theme.Light"></style>

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

2
Bu size yardımcı olabilir: stackoverflow.com/a/16883281/1329733
Jacob R

2
Artık özel yazı tiplerini android studio 3.0 geliştiricisindeki
Yedi

Yanıtlar:


289

Cevap Evet.

Sınıflar TextViewve Buttonsınıflar için Global Roboto ışığı :

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
    <item name="android:buttonStyle">@style/RobotoButtonStyle</item>
</style>

<style name="RobotoTextViewStyle" parent="android:Widget.TextView">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

<style name="RobotoButtonStyle" parent="android:Widget.Holo.Button">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

Temalar.xml listesinden istediğiniz stili seçin , ardından orijinal stilinize göre özel stilinizi oluşturun. Sonunda, stili uygulamanın teması olarak uygulayın.

<application
    android:theme="@style/AppTheme" >
</application>

Sadece Roboto gibi yerleşik yazı tipleriyle çalışacak, ama soru buydu. Özel yazı tipleri için (örneğin varlıklardan yüklenmiş) bu yöntem çalışmaz.

EDIT 08/13/15

AppCompat temaları kullanıyorsanız, android:öneki kaldırmayı unutmayın . Örneğin:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
    <item name="buttonStyle">@style/RobotoButtonStyle</item>
</style>

Not buttonStyleiçermiyor android:önek, ancak textViewStylebunu içermelidir.


4
sans-serif-lightDeğeri nereden aldın ? Bir fontFamilyyerde geçerli değerlerin bir listesi var mı ? Android kaynağındaki temaların ve stil dosyalarının yanı sıra dokümanlara baktım ve hiçbir şey bulamıyorum.
Christopher Perry

34
Bu sadece API seviye 16 için mümkündür .. "android: fontFamily" adı sadece seviye 16 veya üstü üzerinde mevcut .. Bunu API 14 için de yapmanın bir yolu var mı?
Lorenzo Barbagli

3
@LorenzoBarbagli, Kaligrafi
Brais Gabin

10
Özel bir yazı tipim varsa ne yapmalıyım?
Rohit Tigga

2
evet ,, ben de tüm uygulamaya özel yazı eklemek istiyorum. Bunu nasıl yapabilirim ?. TextView'ı geçersiz kılmalı ve ilk cevapta önerildiği gibi tüm TextView'i değiştirmem gerekiyor mu
John

144

Android Oreo'nun piyasaya sürülmesiyle bu hedefe ulaşmak için destek kitaplığını kullanabilirsiniz.

  1. > = 26.0.0 destek kütüphanesine sahipseniz, build.gradle uygulamanızı kontrol edin
  2. Kaynaklar klasörünüze " font " klasörü ekleyin ve fontlarınızı buraya ekleyin
  3. Uygulamanızın ana stilinde varsayılan yazı tipi ailenize başvurun:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
       <item name="android:fontFamily">@font/your_font</item>
       <item name="fontFamily">@font/your_font</item> <!-- target android sdk versions < 26 and > 14 if theme other than AppCompat -->
    </style>

Kontrol https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html daha ayrıntılı bilgi için.


9
API 26+ hedeflenirken, bu kabul edilen yöntem olmalıdır. Destek Kitaplığı'nı kullanırken , sadece android:ön eki kaldırın
webo80 14

2
yalnızca düzeltilmemiş sürümü kullanırsanız sorun olmaz. Ön ekli API <26
webo80

2
Bu, yazı tipini her yerde ayarlamaz ... örneğin, türetilmiş stilleriniz varsa Base.TextAppearance.AppCompat, orada kullanılmaz.
Ixx

3
@Ixx, bu stilleri de nasıl geçersiz kılabilirim?
Primož Kralj

2
Api <26'yı hedeflerken
AppCompatTextView'ı

37

Uygulama yazı tipinizi değiştirmek için aşağıdaki adımları izleyin:

  1. resDizin içinde yeni dizin oluşturun ve arayın font.
  2. Yazı tipi .ttf / .otf yazı tipi klasörünün içine ekleyin, Yazı tipi adının yalnızca küçük harfler ve alt çizgi olduğundan emin olun.
  3. İç res-> values-> styles.xml<resources>-> <style>yazı tipinizi ekleyin <item name="android:fontFamily">@font/font_name</item>.

resim açıklamasını buraya girin

Artık tüm uygulama metniniz eklediğiniz kanalda olmalıdır.


8
özel yazı tiplerini kullanırken normal yazı tipleriyle birlikte kalın yazı tipini nasıl ekleyebilirim?
Rajbir Shienh

Bu sadece API seviye 26 ve üstü ile çalışır, ya API 21 ve altı ne olacak?
zulkarnain shah

34

AŞAĞIDAKİ GÜNCELLEMELERİ OKUYUN

Yeni bir yazı tipi gömme ile aynı sorunu vardı ve sonunda TextView genişletme ve içinde yazı tipini ayarlamak ile çalışmak için aldım.

public class YourTextView extends TextView {

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

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

    public YourTextView(Context context) {
        super(context);
        init();
    }

    private void init() {
        Typeface tf = Typeface.createFromAsset(context.getAssets(),
            "fonts/helveticaneue.ttf");
        setTypeface(tf);
    }
}

TextView Elements'ı daha sonradan her öğede olarak değiştirmeniz gerekir. Ve Eclipse'de UI-Creator'ı kullanırsanız, bazen TextView'leri doğru göstermez. Benim için çalışan tek şey buydu ...

GÜNCELLEME

Günümüzde TextViews genişletmeden tüm uygulamada yazı tiplerini değiştirmek için yansıma kullanıyorum. Bu SO yayınına göz atın

GÜNCELLEME 2

API Seviye 26 ile başlayarak 'destek kütüphanesinde' kullanabilirsiniz

android:fontFamily="@font/embeddedfont"

Daha fazla bilgi: XML yazı tipleri


25
Bu çözüm değil. Sadece TextView değil, birçok farklı görünüm kullanıyorum. Yazı tipini bir kez ayarlamak ve unutmak istiyorum. Ayrıca, kodunuz her TextView için yeni nesne oluşturur. En azından yazı tipini varlıklardan yüklemek için alanı statik olarak bildirin.
tomrozb

2
... şey, bu durumda gerçekten iyi çalışan bir bul ve değiştir işlevi var
longi

1
Bu işe yaramayacak. Sen diyemezsin getContext()değişken statik olduğunda. Bunu tek bir şekilde uygulamalısınız, aksi takdirde mevcut kod derlenmeyecektir.
tomrozb

1
Son işi geri aldım.
longi

1
@ tomrozb: Yaptığım son hızlı değişikliklerin yorumlarınız yüzünden olduğunu fark ettim! Yeterli puanınız olduğu için, kod örneğini kendiniz optimize edebilirsiniz. Aksi halde, artık akıllı telefonların kimsenin umurunda olmadığı birkaç yıl içinde konu hakkında konuşacağız;)
longi

8

Bu kod satırını res / value / styles.xml dosyasına ekleyin

<item name="android:fontFamily">@font/circular_medium</item>

tüm stil böyle görünecek

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:fontFamily">@font/circular_medium</item>
</style>

"dairesel_mediği" kendi yazı tipi adınızla değiştirin.


6

Performanstan bahsetmiyorum, özel yazı tipi için tüm görünümler arasında yinelenen bir yöntem döngüsüne sahip olabilir ve bir TextView ise yazı tipini ayarlayabilirsiniz:

public class Font {
    public static void setAllTextView(ViewGroup parent) {
        for (int i = parent.getChildCount() - 1; i >= 0; i--) {
            final View child = parent.getChildAt(i);
            if (child instanceof ViewGroup) {
                setAllTextView((ViewGroup) child);
            } else if (child instanceof TextView) {
                ((TextView) child).setTypeface(getFont());
            }
        }
    }

    public static Typeface getFont() {
        return Typeface.createFromAsset(YourApplicationContext.getInstance().getAssets(), "fonts/whateverfont.ttf");
    }
}

Tüm etkinliğinizde, geçerli ViewGroup'u setContentView öğesinden sonra bu gruba aktarın ve bitti:

ViewGroup group = (ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content);
Font.setAllTextView(group);

Parça için benzer bir şey yapabilirsiniz.


1
Harika görünüyor ama recyclerView içeriklerinde nasıl çalışacağını merak mı ediyorsunuz?
Srujan Barai

Sadece denedim. render etmek için çok ağır. Yavaşlattığını recyclerViewcehennem gibi.
Srujan Barai

Herhangi bir liste görünümü için kesinlikle önerilmez, bu hile sadece statik görünümü kodlamak için zaman kazanmak içindir.
Allen Chan

5

Tüm uygulama için bunu yapmanın başka bir yolu da bu cevaba dayanan yansımayı kullanmaktır

public class TypefaceUtil {
    /**
     * Using reflection to override default typefaces
     * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE
     * OVERRIDDEN
     *
     * @param typefaces map of fonts to replace
     */
    public static void overrideFonts(Map<String, Typeface> typefaces) {
        try {
            final Field field = Typeface.class.getDeclaredField("sSystemFontMap");
            field.setAccessible(true);
            Map<String, Typeface> oldFonts = (Map<String, Typeface>) field.get(null);
            if (oldFonts != null) {
                oldFonts.putAll(typefaces);
            } else {
                oldFonts = typefaces;
            }
            field.set(null, oldFonts);
            field.setAccessible(false);
        } catch (Exception e) {
            Log.e("TypefaceUtil", "Can not set custom fonts");
        }
    }

    public static Typeface getTypeface(int fontType, Context context) {
        // here you can load the Typeface from asset or use default ones
        switch (fontType) {
            case BOLD:
                return Typeface.create(SANS_SERIF, Typeface.BOLD);
            case ITALIC:
                return Typeface.create(SANS_SERIF, Typeface.ITALIC);
            case BOLD_ITALIC:
                return Typeface.create(SANS_SERIF, Typeface.BOLD_ITALIC);
            case LIGHT:
                return Typeface.create(SANS_SERIF_LIGHT, Typeface.NORMAL);
            case CONDENSED:
                return Typeface.create(SANS_SERIF_CONDENSED, Typeface.NORMAL);
            case THIN:
                return Typeface.create(SANS_SERIF_MEDIUM, Typeface.NORMAL);
            case MEDIUM:
                return Typeface.create(SANS_SERIF_THIN, Typeface.NORMAL);
            case REGULAR:
            default:
                return Typeface.create(SANS_SERIF, Typeface.NORMAL);
        }
    }
}

yazı tiplerini geçersiz kılmak istediğinizde, yöntemi çağırabilir ve aşağıdaki gibi bir yazı tipi haritası verebilirsiniz:

Typeface regular = TypefaceUtil.getTypeface(REGULAR, context);
Typeface light = TypefaceUtil.getTypeface(REGULAR, context);
Typeface condensed = TypefaceUtil.getTypeface(CONDENSED, context);
Typeface thin = TypefaceUtil.getTypeface(THIN, context);
Typeface medium = TypefaceUtil.getTypeface(MEDIUM, context);
Map<String, Typeface> fonts = new HashMap<>();
fonts.put("sans-serif", regular);
fonts.put("sans-serif-light", light);
fonts.put("sans-serif-condensed", condensed);
fonts.put("sans-serif-thin", thin);
fonts.put("sans-serif-medium", medium);
TypefaceUtil.overrideFonts(fonts);

tam örnek kontrolü için

Bu, yalnızca Android SDK 21 ve üstü sürümlerde çalışır.


5

Sadece bu lib sınıf dosyasında derlemek kullanın

complie'me.anwarshahriar:calligrapher:1.0'

ve ana etkinlikte onCreate yönteminde kullanın

Calligrapher calligrapher = new Calligrapher(this);
calligrapher.setFont(this, "yourCustomFontHere.ttf", true);

Bunu yapmanın en zarif süper hızlı yolu budur.


2

Bu benim projem için bir iş, kaynak https://gist.github.com/artem-zinnatullin/7749076

Öğe Klasörü içinde fontlar dizini oluşturun ve özel fontunuzu fontlar dizinine kopyalayın, örnek trebuchet.ttf kullanıyorum;

Bir sınıf oluşturun TypefaceUtil.java;

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

import java.lang.reflect.Field;
public class TypefaceUtil {

    public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
        try {
            final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);

            final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
            defaultFontTypefaceField.setAccessible(true);
            defaultFontTypefaceField.set(null, customFontTypeface);
        } catch (Exception e) {

        }
    }
}

Temayı styles.xml dosyasında düzenleyin aşağıya ekleyin

<item name="android:typeface">serif</item>

Stillerim.xml'deki örnek

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:typeface">serif</item><!-- Add here -->
    </style>


    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowActionBarOverlay">true</item>
        <item name="android:windowFullscreen">true</item>
    </style>
</resources>

Son olarak, Etkinlik veya Parça Oluşturma öğesinde

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TypefaceUtil.overrideFont(getContext(), "SERIF", "fonts/trebuchet.ttf");
    }

0

Android, yazı tiplerinin tüm uygulama boyunca uygulanması için destek sağlamada çok fazla bir şey sağlamaz (bu konuya bakın ). Tüm uygulamanın yazı tipini ayarlamak için 4 seçeneğiniz vardır:

  • Seçenek1: Sistem yazı tipini değiştirmek için yansıma uygulama
  • Seçenek2: Özel yazı tipine ihtiyaç duyan her Görünüm için özel Görünüm sınıfları oluşturma ve alt sınıflandırma
  • Seçenek3: Geçerli ekranın görünüm hiyerarşisini geçen bir Görünüm Tarayıcısı uygulama
  • Seçenek4: 3. taraf bir kütüphane kullanın.

Bu seçeneklerin ayrıntılarını burada bulabilirsiniz .


0

Bu sorunun oldukça eski olduğunu biliyorum, ama güzel bir çözüm buldum. Temel olarak, bu işleve bir kapsayıcı düzeni iletirsiniz ve yazı tipini desteklenen tüm görünümlere uygular ve alt mizanpajlarda özyinelemeli olarak çalışır:

public static void setFont(ViewGroup layout)
{
    final int childcount = layout.getChildCount();
    for (int i = 0; i < childcount; i++)
    {
        // Get the view
        View v = layout.getChildAt(i);

        // Apply the font to a possible TextView
        try {
            ((TextView) v).setTypeface(MY_CUSTOM_FONT);
            continue;
        }
        catch (Exception e) { }

        // Apply the font to a possible EditText
        try {
            ((TextView) v).setTypeface(MY_CUSTOM_FONT);
            continue;
        }
        catch (Exception e) { }

        // Recursively cicle into a possible child layout
        try {
            ViewGroup vg = (ViewGroup) v;
            Utility.setFont(vg);
            continue;
        }
        catch (Exception e) { }
    }
}

0

için uygulamanın sadece ayarlanan yazı tipine normal, sans, serifveya monospace(değil özel bir yazı tipine!), bunu yapabilirsin.

bir tema tanımlayın ve android:typefaceözelliği kullanmak istediğiniz yazı tipine ayarlayın styles.xml:

<resources>

    <!-- custom normal activity theme -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <!-- other elements -->
        <item name="android:typeface">monospace</item>
    </style>

</resources>

temayı AndroidManifest.xmldosyadaki tüm uygulamaya uygulayın :

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application
        android:theme="@style/AppTheme" >
    </application>
</manifest>

android referansı


Bunun işe yaradığından emin misin? Android doc'a göre: "Şu sabit değerlerden biri olmalı: normal, sans, serif, tek aralıklı".
tomrozb

1
Oh görüyorum ... haklısın ... her şeyden önce soruyu anlamadım: x Sadece tüm uygulamamın bir tek boşluklu yazı tipi (özel değil) kullanmasını istedim ve çalıştığını gördüm, bu yüzden bunu gönderdim burada ......... cevabım hala benzer bir şey yapmak isteyenler için yararlı olabilir düşünüyorum .... bu yüzden onu düzenlemek ve burada bırakın ..... ben iyiyim oyları biriktirir. işaret ettiğin için teşekkürler
Eric

Hey @Dave Cruise, sadece tek aralık için mi çalışıyor? Ben sadece monospace için test ettik ... ve başka bir şey .... bu yüzden emin değilim ... ama belgelere göre, "normal", "sans" ve "serif" için de çalışmalıdır .. .i yazı tipinin yazı tipinden daha genel olduğunu düşünüyorum, bu nedenle uygulamanın yazı tipini "consolas" gibi belirli bir yazı tipine ayarlamak için kullanamayız.
Eric

@Eric yea. benim de bir fikrim yok. monospace bir cazibe gibi çalışır, ancak normal, sans veya serif için şans yoktur.
Dave Cruise

0

Hafif ve uygulaması kolay bu kütüphaneyi deneyin

https://github.com/sunnag7/FontStyler

<com.sunnag.fontstyler.FontStylerView
              android:textStyle="bold"
              android:text="@string/about_us"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:paddingTop="8dp"
              app:fontName="Lato-Bold"
              android:textSize="18sp"
              android:id="@+id/textView64" />

-7

Cevap hayır, yapamazsınız. Bkz . Uygulamanın tamamı için özel bir yazı tipi ayarlamak mümkün mü? daha fazla bilgi için.

Orada geçici çözümler vardır, ama hatları hiçbir şey "Burada kod ve tüm fontların tek hat olacak bu yerine o ".

(Bunun için Google'a ve Apple'a teşekkür ediyorum). Özel yazı tiplerinin bir yeri vardır, ancak uygulamayı geniş çapta değiştirmelerini kolaylaştırmak, Comic Sans uygulamalarının tüm dünyasını yaratırdı )


41
Yorumunuza tamamen katılmıyorum. Bir yazı tipini genel olarak ayarlamak, gerekli geçici çözümleri gerektiren bir şey değil, önemsiz olmalıdır. Bunu uygulamak için Google / Apple'a değil, "Comic Sans" uygulamalarından kaçınmak dünyanın geliştiricilerine / tasarımcılarına kalmış.
LocalPCGuy

4
Tutarlılık> Şık tasarım.
Martin Marconcini

14
Ancak, tutarlılık <işlevselliği. İncil İbranice gösteren uygulamalar geliştiriyoruz. Android cihazlarda bulunan tüm stok yazı tipleri (en son Android L yazı tipleri dahil), cantillation işaretleri oluşturma konusunda uçsuz bucaksız bir iş yaparlar (ve daha iyi olmalarına rağmen sesli harfler üzerinde vasat bir iş yaparlar). Uygulamamız boyunca kesinlikle özel bir yazı tipi kullanmamız gerekiyor ve sadece gerekli tüm görünümleri almak için çok fazla kod yazmak zorunda kaldık.
Ted Hopp
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.