Android'de FontView Ailesi Nasıl Değiştirilir


739

Bu yüzden android:fontFamilyAndroid'de değiştirmek istiyorum, ancak Android'de önceden tanımlanmış yazı tipleri görmüyorum. Önceden tanımlanmış olanlardan birini nasıl seçerim? Kendi TypeFace'imi tanımlamam gerekmiyor ama tek ihtiyacım şu anda gösterilenden farklı.

<TextView
    android:id="@+id/HeaderText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="52dp"
    android:gravity="center"
    android:text="CallerBlocker"
    android:textSize="40dp"
    android:fontFamily="Arial"
 />

Görünüşe göre orada yaptığım gerçekten işe yaramayacak! BTW android:fontFamily="Arial"aptalca bir girişimdi!


bu bağlantıyı kontrol edin stackoverflow.com/questions/2376250/…
duggu

Yanıtlar:


1660

Android 4.1 / 4.2 / 5.0 sürümünden , aşağıdaki Roboto font aileleri mevcuttur:

android:fontFamily="sans-serif"           // roboto regular
android:fontFamily="sans-serif-light"     // roboto light
android:fontFamily="sans-serif-condensed" // roboto condensed
android:fontFamily="sans-serif-black"     // roboto black
android:fontFamily="sans-serif-thin"      // roboto thin (android 4.2)
android:fontFamily="sans-serif-medium"    // roboto medium (android 5.0)

resim açıklamasını buraya girin

ile bütünlüğünde

android:textStyle="normal|bold|italic"

bu 16 varyant mümkündür:

  • Roboto düzenli
  • Roboto italik
  • Roboto kalın
  • Roboto kalın italik
  • Roboto-Işık
  • Roboto-Light italik
  • Roboto İnce
  • Roboto-İnce italik
  • Roboto-Yoğunlaştırılmış
  • Roboto-Yoğun italik
  • Roboto-Yoğunlaştırılmış kalın
  • Roboto-Yoğunlaştırılmış kalın italik
  • Roboto-Siyah
  • Roboto-Siyah italik
  • Roboto-Orta
  • Roboto-Orta italik

fonts.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="font_family_light">sans-serif-light</string>
    <string name="font_family_medium">sans-serif-medium</string>
    <string name="font_family_regular">sans-serif</string>
    <string name="font_family_condensed">sans-serif-condensed</string>
    <string name="font_family_black">sans-serif-black</string>
    <string name="font_family_thin">sans-serif-thin</string>
</resources>

17
Bunu unutma: android: fontFamily = "sans-serif-thin" // roboto ince
Sam Lu

6
Roboto örnek kitabında "siyah küçük kapaklar" adlı bir varyantı gördüm , ancak kullanmayı başaramıyorum. Kullanmak android:fontFamily="sans-serif-black-small-caps"işe yaramıyor. Birisi biliyor mu?
tbruyelle

3
i burada yazdığınız ne bu yazı tipi ailesi herhangi bir bulmak mümkün değil. birlikte "sans-serif" bulmak mümkün değil.
Monty

9
Bu güzel bir liste. Bu bilgilerin nereden geldiğine dair bir bağlantısı olan var mı? Google'ın bunu android:fontFamilyTextView'daki dokümantasyon için bulması kolay bir yerde kendi dokümanlarında bulundurması iyi olurdu .
Christopher Perry

8
Yazı tiplerinin kesin listesi burada açıklandığı gibi system_fonts.xml dosyasında bulunabilir
Newtonx

207

Yazı tipini programlı olarak ayarlamanın yolu budur:

TextView tv = (TextView) findViewById(R.id.appname);
Typeface face = Typeface.createFromAsset(getAssets(),
            "fonts/epimodem.ttf");
tv.setTypeface(face);

yazı tipi dosyasını varlıklar klasörünüze yerleştirin. Benim durumumda fontlar adlı bir alt dizin oluşturdum.

DÜZENLEME: Varlıklar klasörünüzün nerede olduğunu merak ediyorsanız bu soruya bakın


34
Bu işe yarar, ancak bunun bellek sızıntısı oluşturabileceğini lütfen unutmayın . Bu cevap kullanılarak düzeltilebilir .
Charles Madere

@ScootrNova Çözümünüzü kullandığımda bu hatayı alıyorum. Hata: Yazı tipi varlığı bulunamadı gothic.ttf
Sagar Devanga

Tüm uygulamaya nasıl uygulanır? Şu anda örnekte sadece
metin

177

Android-Studio 3.0'dan başlayarak yazı tipi ailesini değiştirmek çok kolay

Destek kitaplığı 26'yı kullanarak Android API sürüm 16 ve daha yeni sürümleri çalıştıran cihazlarda çalışır

Dizin fontaltında bir klasör oluşturun. resİstediğiniz yazı tipini indirin ve fontklasörün içine yapıştırın . Yapı aşağıdaki gibi bir şey olmalı

Buraya

Not: Android Destek Kitaplığı 26.0'dan itibaren, fontlarınızın Api 26 veya daha düşük bir sürümünü çalıştıran cihazlara yüklenmesini sağlamak için her iki özellik grubunu da (android: ve app:) bildirmeniz gerekir.

Artık aşağıdakileri kullanarak mizanpajdaki yazı tipini değiştirebilirsiniz

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

Programlı olarak değiştirmek için

 Typeface typeface = getResources().getFont(R.font.myfont);
   //or to support all versions use
Typeface typeface = ResourcesCompat.getFont(context, R.font.myfont);
 textView.setTypeface(typeface);  

Styles.xml kullanarak yazı tipini değiştirmek için bir stil oluşturun

 <style name="Regular">
        <item name="android:fontFamily">@font/dancing_script</item>
        <item name="fontFamily">@font/dancing_script</item>
        <item name="android:textStyle">normal</item>
 </style>

ve bu stili TextView

  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    style="@style/Regular"/>

kendi yazı tipi ailenizi de oluşturabilirsiniz

- 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.

- Enter dosya adını ve ardından Tamam . Yeni font kaynak XML'i editörde açılır.

Kendi font ailenizi buraya yazın, örneğin

<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
        android:fontStyle="normal"
        android:fontWeight="400"
        android:font="@font/lobster_regular" />
    <font
        android:fontStyle="italic"
        android:fontWeight="400"
        android:font="@font/lobster_italic" />
</font-family>

bu sadece belirli bir fontStyle ve fontWeight öğesinin, belirli bir varyantı oluşturmak için kullanılacak font kaynağına eşleştirilmesidir. FontStyle için geçerli değerler normal veya italik; ve fontWeight, CSS yazı tipi ağırlık belirtimine uygundur

1. To değiştirmek de fontfamily düzen yazabilir

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

2. Programlı Olarak Değiştirmek İçin

 Typeface typeface = getResources().getFont(R.font.lobster);
   //or to support all versions use
Typeface typeface = ResourcesCompat.getFont(context, R.font.lobster);
 textView.setTypeface(typeface);  

Tüm Uygulamanın yazı tipini değiştirmek için Bu iki satırı AppTheme'e ekleyin

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

Daha fazla bilgi için Dokümantasyon , Android Özel Yazı Tipleri Eğiticisine bakın


7
Not: Bu şu anda yalnızca Android Studio 3.0 Preview'da çalışmaktadır. Android Studio 2.3.3'te benim için çalışmadı. Umarım bu biraz zaman kazandırır!
Tash Pemhiwa

2
Sadece yapamayacağınız için yazı tipini bir parçanın içinden nasıl alabilirsiniz getResources()? EDIT : Cevabınızın sonunda bu satır benim için çalıştı: Typeface typeface = ResourcesCompat.getFont(context, R.font.myfont);
Paradox

Her nasılsa benim durumumda Caligtraphy ile karşılaştırıldığında yazı tipinin bozuk görünmesini sağladı.
Ağırlık da

@LeoDroidcoder işe yarıyor, her ikisini de kullandığınızdan emin olun android:fontWeightveapp:fontWeight
Manohar Reddy

Birkaç kez kontrol ettim. Etkisi yok.
Leo Droidcoder

100

/system/etc/fonts.xmlYeni bir projede ayrışmak zorunda kaldım . Lollipop'un şu anki yazı tipi aileleri şunlardır:

╔════╦════════════════════════════╦═════════════════════════════╗
     FONT FAMILY                 TTF FILE                    
╠════╬════════════════════════════╬═════════════════════════════╣
  1  casual                      ComingSoon.ttf              
  2  cursive                     DancingScript-Regular.ttf   
  3  monospace                   DroidSansMono.ttf           
  4  sans-serif                  Roboto-Regular.ttf          
  5  sans-serif-black            Roboto-Black.ttf            
  6  sans-serif-condensed        RobotoCondensed-Regular.ttf 
  7  sans-serif-condensed-light  RobotoCondensed-Light.ttf   
  8  sans-serif-light            Roboto-Light.ttf            
  9  sans-serif-medium           Roboto-Medium.ttf           
 10  sans-serif-smallcaps        CarroisGothicSC-Regular.ttf 
 11  sans-serif-thin             Roboto-Thin.ttf             
 12  serif                       NotoSerif-Regular.ttf       
 13  serif-monospace             CutiveMono.ttf              
╚════╩════════════════════════════╩═════════════════════════════╝

Ayrıştırıcı ( FontListParser tabanlı ):

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Xml;

/**
 * Helper class to get the current font families on an Android device.</p>
 * 
 * Usage:</p> {@code List<SystemFont> fonts = FontListParser.safelyGetSystemFonts();}</p>
 */
public final class FontListParser {

    private static final File FONTS_XML = new File("/system/etc/fonts.xml");

    private static final File SYSTEM_FONTS_XML = new File("/system/etc/system_fonts.xml");

    public static List<SystemFont> getSystemFonts() throws Exception {
        String fontsXml;
        if (FONTS_XML.exists()) {
            fontsXml = FONTS_XML.getAbsolutePath();
        } else if (SYSTEM_FONTS_XML.exists()) {
            fontsXml = SYSTEM_FONTS_XML.getAbsolutePath();
        } else {
            throw new RuntimeException("fonts.xml does not exist on this system");
        }
        Config parser = parse(new FileInputStream(fontsXml));
        List<SystemFont> fonts = new ArrayList<>();

        for (Family family : parser.families) {
            if (family.name != null) {
                Font font = null;
                for (Font f : family.fonts) {
                    font = f;
                    if (f.weight == 400) {
                        break;
                    }
                }
                SystemFont systemFont = new SystemFont(family.name, font.fontName);
                if (fonts.contains(systemFont)) {
                    continue;
                }
                fonts.add(new SystemFont(family.name, font.fontName));
            }
        }

        for (Alias alias : parser.aliases) {
            if (alias.name == null || alias.toName == null || alias.weight == 0) {
                continue;
            }
            for (Family family : parser.families) {
                if (family.name == null || !family.name.equals(alias.toName)) {
                    continue;
                }
                for (Font font : family.fonts) {
                    if (font.weight == alias.weight) {
                        fonts.add(new SystemFont(alias.name, font.fontName));
                        break;
                    }
                }
            }
        }

        if (fonts.isEmpty()) {
            throw new Exception("No system fonts found.");
        }

        Collections.sort(fonts, new Comparator<SystemFont>() {

            @Override
            public int compare(SystemFont font1, SystemFont font2) {
                return font1.name.compareToIgnoreCase(font2.name);
            }

        });

        return fonts;
    }

    public static List<SystemFont> safelyGetSystemFonts() {
        try {
            return getSystemFonts();
        } catch (Exception e) {
            String[][] defaultSystemFonts = {
                    {
                            "cursive", "DancingScript-Regular.ttf"
                    }, {
                            "monospace", "DroidSansMono.ttf"
                    }, {
                            "sans-serif", "Roboto-Regular.ttf"
                    }, {
                            "sans-serif-light", "Roboto-Light.ttf"
                    }, {
                            "sans-serif-medium", "Roboto-Medium.ttf"
                    }, {
                            "sans-serif-black", "Roboto-Black.ttf"
                    }, {
                            "sans-serif-condensed", "RobotoCondensed-Regular.ttf"
                    }, {
                            "sans-serif-thin", "Roboto-Thin.ttf"
                    }, {
                            "serif", "NotoSerif-Regular.ttf"
                    }
            };
            List<SystemFont> fonts = new ArrayList<>();
            for (String[] names : defaultSystemFonts) {
                File file = new File("/system/fonts", names[1]);
                if (file.exists()) {
                    fonts.add(new SystemFont(names[0], file.getAbsolutePath()));
                }
            }
            return fonts;
        }
    }

    /* Parse fallback list (no names) */
    public static Config parse(InputStream in) throws XmlPullParserException, IOException {
        try {
            XmlPullParser parser = Xml.newPullParser();
            parser.setInput(in, null);
            parser.nextTag();
            return readFamilies(parser);
        } finally {
            in.close();
        }
    }

    private static Alias readAlias(XmlPullParser parser) throws XmlPullParserException, IOException {
        Alias alias = new Alias();
        alias.name = parser.getAttributeValue(null, "name");
        alias.toName = parser.getAttributeValue(null, "to");
        String weightStr = parser.getAttributeValue(null, "weight");
        if (weightStr == null) {
            alias.weight = 0;
        } else {
            alias.weight = Integer.parseInt(weightStr);
        }
        skip(parser); // alias tag is empty, ignore any contents and consume end tag
        return alias;
    }

    private static Config readFamilies(XmlPullParser parser) throws XmlPullParserException,
            IOException {
        Config config = new Config();
        parser.require(XmlPullParser.START_TAG, null, "familyset");
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            if (parser.getName().equals("family")) {
                config.families.add(readFamily(parser));
            } else if (parser.getName().equals("alias")) {
                config.aliases.add(readAlias(parser));
            } else {
                skip(parser);
            }
        }
        return config;
    }

    private static Family readFamily(XmlPullParser parser) throws XmlPullParserException,
            IOException {
        String name = parser.getAttributeValue(null, "name");
        String lang = parser.getAttributeValue(null, "lang");
        String variant = parser.getAttributeValue(null, "variant");
        List<Font> fonts = new ArrayList<Font>();
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String tag = parser.getName();
            if (tag.equals("font")) {
                String weightStr = parser.getAttributeValue(null, "weight");
                int weight = weightStr == null ? 400 : Integer.parseInt(weightStr);
                boolean isItalic = "italic".equals(parser.getAttributeValue(null, "style"));
                String filename = parser.nextText();
                String fullFilename = "/system/fonts/" + filename;
                fonts.add(new Font(fullFilename, weight, isItalic));
            } else {
                skip(parser);
            }
        }
        return new Family(name, fonts, lang, variant);
    }

    private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
        int depth = 1;
        while (depth > 0) {
            switch (parser.next()) {
            case XmlPullParser.START_TAG:
                depth++;
                break;
            case XmlPullParser.END_TAG:
                depth--;
                break;
            }
        }
    }

    private FontListParser() {

    }

    public static class Alias {

        public String name;

        public String toName;

        public int weight;
    }

    public static class Config {

        public List<Alias> aliases;

        public List<Family> families;

        Config() {
            families = new ArrayList<Family>();
            aliases = new ArrayList<Alias>();
        }

    }

    public static class Family {

        public List<Font> fonts;

        public String lang;

        public String name;

        public String variant;

        public Family(String name, List<Font> fonts, String lang, String variant) {
            this.name = name;
            this.fonts = fonts;
            this.lang = lang;
            this.variant = variant;
        }

    }

    public static class Font {

        public String fontName;

        public boolean isItalic;

        public int weight;

        Font(String fontName, int weight, boolean isItalic) {
            this.fontName = fontName;
            this.weight = weight;
            this.isItalic = isItalic;
        }

    }

    public static class SystemFont {

        public String name;

        public String path;

        public SystemFont(String name, String path) {
            this.name = name;
            this.path = path;
        }

    }
}

Projenizde yukarıdaki sınıfı kullanmaktan çekinmeyin. Örneğin, kullanıcılarınıza yazı tipi aileleri arasından seçim yapabilir ve yazı tiplerini tercihlerine göre ayarlayabilirsiniz.

Tamamlanmamış küçük bir örnek:

final List<FontListParser.SystemFont> fonts = FontListParser.safelyGetSystemFonts();
String[] items = new String[fonts.size()];
for (int i = 0; i < fonts.size(); i++) {
    items[i] = fonts.get(i).name;
}

new AlertDialog.Builder(this).setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        FontListParser.SystemFont selectedFont = fonts.get(which);
        // TODO: do something with the font
        Toast.makeText(getApplicationContext(), selectedFont.path, Toast.LENGTH_LONG).show();
    }
}).show();

Belki de Android'in hangi sürümünün hangi yazı tipini eklediğini biliyor musunuz?
android geliştirici

@androiddeveloper bilmiyorum. Muhtemelen değişiklikleri burada görüntüleyerek öğrenebilirsiniz
Jared Rummler

@JaredRummler, cehaletimi affet. Neden ağırlık = = 400 nedir?
Samuel

1
@Samuel Bu koda bir süredir bakmadım, ancak "normal" veya "normal" fontlar için 400 font ağırlığı kullanılıyor. Örneğin, Roboto-Regular'ın ağırlığı 400'dür.
Jared Rummler

Kök falan mı gerekiyor? Bu kodu Android öykünücüsünde (sürüm 8.1) çalıştırdım ve getSystemFonts()aradığımda bir istisna aldımorg.xmlpull.v1.XmlPullParserException: END_TAG expected (position:START_TAG (empty) <axis tag='wdth' stylevalue='100.0'>@219:51 in java.io.InputStreamReader@f001fb3)
Damn Vegetables

49

Android, XML düzeninden özel yazı tipleri ayarlamanıza izin vermez. Bunun yerine, uygulamanızın varlıklar klasöründeki belirli yazı tipi dosyasını paketlemeli ve programlı olarak ayarlamalısınız. Gibi bir şey:

TextView textView = (TextView) findViewById(<your TextView ID>);
Typeface typeFace = Typeface.createFromAsset(getAssets(), "<file name>");
textView.setTypeface(typeFace);

Bu kodu yalnızca setContentView () çağrıldıktan sonra çalıştırabileceğinizi unutmayın. Ayrıca, yalnızca bazı yazı tipleri Android tarafından desteklenir ve bir .ttf (TrueType)veya .otf (OpenType)biçiminde olmalıdır. O zaman bile, bazı yazı tipleri çalışmayabilir.

Bu , kesinlikle Android'de çalışan bir yazı tipidir ve yazı tipi dosyanızın Android tarafından desteklenmemesi durumunda kodunuzun çalıştığını onaylamak için bunu kullanabilirsiniz.

Android O Güncellemesi: Bu, Roger'ın yorumuna dayanarak Android O'daki XML ile mümkün .


"Android, XML düzeninden özel yazı tipleri ayarlamanıza izin vermiyor." Bu, özelleştirilmiş yazı tipi ailesi oluşturmanıza ve bunları XML'de uygulamanıza izin veren Android O'da değiştirildi: developer.android.com/preview/features/working-with-fonts.html
Roger Huang

27

Roboto'yu programlı olarak ayarlamak için:

paint.setTypeface(Typeface.create("sans-serif-thin", Typeface.NORMAL));

25

İle aynı android:typeface.

yerleşik yazı tipleri:

  • normal
  • sans
  • serif
  • tek aralıklı

Bkz. Android: yazı biçimi .


4
Aynı şey olduğunu düşünmüyorum, ama ikisini de kullanamadığımız anlaşılıyor. Görünüşe göre şu anda eşleştirilen üç farklı özellikten daha azı yok setTypeface(). Yani fontFamily, typefaceve textStyle. Ama hayatım boyunca, somut bir Yazı Tipi örneğini çözmek için bunların nasıl tam olarak birleştirildiğini anlayamıyorum. Bunu çözebilen biri var mı? Google'ın belgeleri faydalı olmaktan daha az ...
Rad Haring

23

Programlı olarak kullanmak isterseniz,

label.setTypeface(Typeface.SANS_SERIF, Typeface.ITALIC);

Nerede SANS_SERIFkullanabilirsiniz:

  • DEFAULT
  • DEFAULT_BOLD
  • MONOSPACE
  • SANS_SERIF
  • SERIF

Ve nerede ITALICkullanabilirsiniz:

  • BOLD
  • BOLD_ITALIC
  • ITALIC
  • NORMAL

Tümü Android Geliştiricileri'nde belirtildi


15

Android uygulamasında özel yazı tiplerini kullanmanıza izin vermek için tasarlanmış Chris Jenx tarafından mükemmel kütüphane Hat kullanıyorum . Bir şans ver!


Evet, ama örneğin ben işlevsel olarak kullanmak istiyorum, ama tüm kütüphane uygulamak istemiyordu;)
Morozov

12

İstediğin şey mümkün değil. TypeFaceKodunuzu girmeniz gerekir .

Gelen XMLyapabileceğiniz şeydir

android:typeface="sans" | "serif" | "monospace"

aksi takdirde bu XML Yazı Tipleri ile fazla oynayamazsınız. :)

İçin Arialkodunuzda tip yüz ayarlamak gerekir.


11

Yazı tiplerini yönetmenin kolay bir yolu, bunları kaynaklar aracılığıyla bildirmektir:

<!--++++++++++++++++++++++++++-->
<!--added on API 16 (JB - 4.1)-->
<!--++++++++++++++++++++++++++-->
<!--the default font-->
<string name="fontFamily__roboto_regular">sans-serif</string>
<string name="fontFamily__roboto_light">sans-serif-light</string>
<string name="fontFamily__roboto_condensed">sans-serif-condensed</string>

<!--+++++++++++++++++++++++++++++-->
<!--added on API 17 (JBMR1 - 4.2)-->
<!--+++++++++++++++++++++++++++++-->
<string name="fontFamily__roboto_thin">sans-serif-thin</string>

<!--+++++++++++++++++++++++++++-->
<!--added on Lollipop (LL- 5.0)-->
<!--+++++++++++++++++++++++++++-->
<string name="fontFamily__roboto_medium">sans-serif-medium</string>
<string name="fontFamily__roboto_black">sans-serif-black</string>
<string name="fontFamily__roboto_condensed_light">sans-serif-condensed-light</string>

Bu, burada ve burada kaynak koduna dayanmaktadır


Nerede ilan edilir?
AZ_

@AZ_ Tıpkı birçok kaynak dosyası gibi, dosyayı "res / değerleri /" klasörünün içine istediğiniz herhangi bir XML dosyasına koyabilirsiniz. Örneğin, "res / değerleri / fonts.xml" içine koyun. Ve, bunu kullanmak için, örneğin bunu basitçe yapın: android: fontFamily = "string / fontFamily__roboto_regular"
android geliştirici

Teşekkürler, bu github.com/norbsoft/android-typeface-helper kullanıyorum ve gerçekten yararlı
AZ_

Tamam, kütüphane muhtemelen programlı olarak yapıyor. İşte XML için
android geliştirici

9

Dinamik olarak, fontmlini android'e benzer şekilde ayarlayabilirsiniz: xml'de fontFamily,

For Custom font:

 TextView tv = ((TextView) v.findViewById(R.id.select_item_title));
 Typeface face=Typeface.createFromAsset(getAssets(),"fonts/mycustomfont.ttf"); 
 tv.setTypeface(face);

For Default font:

 tv.setTypeface(Typeface.create("sans-serif-medium",Typeface.NORMAL));

Bunlar, kullanılan varsayılan yazı tipi ailesinin listesidir, "sans-serif-medium" çift ​​tırnak dizesini değiştirerek bunlardan herhangi birini kullanın

FONT FAMILY                    TTF FILE                    

1  casual                      ComingSoon.ttf              
2  cursive                     DancingScript-Regular.ttf   
3  monospace                   DroidSansMono.ttf           
4  sans-serif                  Roboto-Regular.ttf          
5  sans-serif-black            Roboto-Black.ttf            
6  sans-serif-condensed        RobotoCondensed-Regular.ttf 
7  sans-serif-condensed-light  RobotoCondensed-Light.ttf   
8  sans-serif-light            Roboto-Light.ttf            
9  sans-serif-medium           Roboto-Medium.ttf           
10  sans-serif-smallcaps       CarroisGothicSC-Regular.ttf 
11  sans-serif-thin            Roboto-Thin.ttf             
12  serif                      NotoSerif-Regular.ttf       
13  serif-monospace            CutiveMono.ttf              

"mycustomfont.ttf" ttf dosyasıdır. Yol olacak src / varlık / yazı / mycustomfont.ttf bunun içinde varsayılan yazı hakkında daha başvurabilir, Varsayılan yazı ailesi


9
Typeface typeface = ResourcesCompat.getFont(context, R.font.font_name);
textView.setTypeface(typeface);

res> font dizininden programlı olarak herhangi bir metin görünümüne kolayca font ayarlayın


8

Sanırım çok geç kaldım ama belki bu çözüm başkaları için yararlı olabilir. Özel yazı tipi kullanmak için yazı tipi dosyanızı yazı tipi dizininize yerleştirin.

textView.setTypeface(ResourcesCompat.getFont(this, R.font.lato));

6

Biraz deneme yanılma ile aşağıdakileri öğrendim.

* .Xml içinde, stok yazı tiplerini yalnızca yazı tipi ile değil, aşağıdaki işlevlerle birleştirebilirsiniz:

 android:fontFamily="serif" 
 android:textStyle="italic"

Bu iki stille, başka hiçbir durumda yazı karakterini kullanmaya gerek yoktu. Kombinasyon aralığı fontfamily & textStyle ile çok daha büyük.


5

Android: fontFamily'ın geçerli değeri /system/etc/system_fonts.xml(4.x) veya /system/etc/fonts.xml(5.x) içinde tanımlanır. Ancak Aygıt Üreticisi bunu değiştirebilir, bu nedenle fontFamily değerini ayarlayarak kullanılan gerçek yazı tipi belirtilen aygıtın yukarıda belirtilen dosyasına bağlıdır.

AOSP'de Arial yazı tipi geçerlidir, ancak "Arial" değil "arial" kullanılarak tanımlanmalıdır, örneğin android: fontFamily = "arial" . Kitkat'ın system_fonts.xml dosyasına bir qucik bakın

    <family>
    <nameset>
        <name>sans-serif</name>
        <name>arial</name>
        <name>helvetica</name>
        <name>tahoma</name>
        <name>verdana</name>
    </nameset>
    <fileset>
        <file>Roboto-Regular.ttf</file>
        <file>Roboto-Bold.ttf</file>
        <file>Roboto-Italic.ttf</file>
        <file>Roboto-BoldItalic.ttf</file>
    </fileset>
</family>

////////////////////////////////////////////////// ////////////////////////

Düzende bir "yazı tipi" tanımlamak için üç alakalı xml özelliği vardır : android: fontFamily , android: yazı biçimi ve android: textStyle . "FontFamily" ve "textStyle" veya "fontface" ve "textStyle" birleşimi, yazı tipinin metindeki görünümünü değiştirmek için kullanılabilir, tek başına kullanılır. TextView.java'daki kod snippet'i şöyle :

    private void setTypefaceFromAttrs(String familyName, int typefaceIndex, int styleIndex) {
    Typeface tf = null;
    if (familyName != null) {
        tf = Typeface.create(familyName, styleIndex);
        if (tf != null) {
            setTypeface(tf);
            return;
        }
    }
    switch (typefaceIndex) {
        case SANS:
            tf = Typeface.SANS_SERIF;
            break;

        case SERIF:
            tf = Typeface.SERIF;
            break;

        case MONOSPACE:
            tf = Typeface.MONOSPACE;
            break;
    }
    setTypeface(tf, styleIndex);
}


    public void setTypeface(Typeface tf, int style) {
    if (style > 0) {
        if (tf == null) {
            tf = Typeface.defaultFromStyle(style);
        } else {
            tf = Typeface.create(tf, style);
        }

        setTypeface(tf);
        // now compute what (if any) algorithmic styling is needed
        int typefaceStyle = tf != null ? tf.getStyle() : 0;
        int need = style & ~typefaceStyle;
        mTextPaint.setFakeBoldText((need & Typeface.BOLD) != 0);
        mTextPaint.setTextSkewX((need & Typeface.ITALIC) != 0 ? -0.25f : 0);
    } else {
        mTextPaint.setFakeBoldText(false);
        mTextPaint.setTextSkewX(0);
        setTypeface(tf);
    }
}

Koddan Görebiliriz:

  1. "fontFamily" ayarlanırsa, "yazı tipi" yoksayılır.
  2. "yazı biçimi" standart ve sınırlı geçerli değerlere sahiptir. Aslında, değerler "normal" "sans" "serif" ve "tek boşluk" şeklindedir, system_fonts.xml (4.x) veya fonts.xml (5.x) 'de bulunabilirler. Aslında hem "normal" hem de "sans", sistemin varsayılan yazı tipidir.
  3. "fontFamily", yerleşik fontların tüm fontlarını ayarlamak için kullanılabilirken, "fontface" yalnızca "sans-serif" "serif" ve "monospace" (dünyadaki üç ana font türü kategorisi) tipik fontlarını sağlar .
  4. Yalnızca "textStyle" ayarlandığında, varsayılan yazı tipini ve belirtilen stili ayarladık. Etkin değer "normal" "kalın" "italik" ve "kalın | italik" tir.

4

İşte bazı durumlarda çalışabilecek daha kolay bir çalışma. İlke, xml düzeninize görünmeyen bir TextVview eklemek ve java kodunda typeFace öğesini almaktır .

Xml dosyasındaki düzen:

 <TextView
        android:text="The classic bread is made of flour hot and salty. The classic bread is made of flour hot and salty. The classic bread is made of flour hot and salty."
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:fontFamily="sans-serif-thin"
        android:id="@+id/textViewDescription"/>

Ve java kodu:

myText.setTypeface(textViewSelectedDescription.getTypeface());

Benim için çalıştı (örneğin bir TextSwitcher içinde).


4

Bunu dene:

TextView textview = (TextView) findViewById(R.id.textview);

Typeface tf= Typeface.createFromAsset(getAssets(),"fonts/Tahoma.ttf");
textview .setTypeface(tf);

4

Bunu, aşağıdaki gibi res dizininin altına bir yazı tipi klasörü ekleyerek de yapabilirsiniz.

resim açıklamasını buraya girin

Ardından, kaynak türü olarak Yazı Tipi'ni seçin. resim açıklamasını buraya girin

Https://www.1001fonts.com/ adresinden kullanılabilir yazı tiplerini bulabilir ve ardından TTF dosyalarını bu yazı tipi dizinine çıkarabilirsiniz .

resim açıklamasını buraya girin

Son olarak, android: fontFamily: "@ font / urfontfilename" öğesini ekleyerek metin görünümünüzü içeren XML dosyasını değiştirin.

resim açıklamasını buraya girin


çok güzel, bunun için teşekkürler. idk neden diğerlerinin daha fazla yıldız var ama seninki malzeme tasarımı metin görünümü ile çalıştığı onaylandı, app:fontFamily=ancak kullanmalısın , her şey aynı.
EvOlaNdLuPiZ

Hayatımı kurtardın, font adlı bir klasör oluşturmuştum ve işe yaramadı. Neyse ben yolunuzu kullanılan ve worked.Thanks
Hilal

4

Basit bir yol, projeye istenen yazı tipini eklemektir .

Git File-> New-> Yeni Kaynak Rehberi seç yazı

Bu, kaynaklarınızda yeni bir dizin, yazı tipi oluşturur .

Yazı tipinizi indirin (.ttf) . Aynı şey için https://fonts.google.com kullanıyorum

Bunu yazı tipleri klasörünüze ekleyin ve XML veya programlı olarak kullanın.

XML -

<TextView 
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/your_font"/>

Programlı olarak -

 Typeface typeface = getResources().getFont(R.font.your_font);
 textView.setTypeface(typeface); 

9
Daha iyi kullanım ResourcesCompat.getFontyöntemi
Vadim Kotov

3
<string name="font_family_display_4_material">sans-serif-light</string>
<string name="font_family_display_3_material">sans-serif</string>
<string name="font_family_display_2_material">sans-serif</string>
<string name="font_family_display_1_material">sans-serif</string>
<string name="font_family_headline_material">sans-serif</string>
<string name="font_family_title_material">sans-serif-medium</string>
<string name="font_family_subhead_material">sans-serif</string>
<string name="font_family_menu_material">sans-serif</string>
<string name="font_family_body_2_material">sans-serif-medium</string>
<string name="font_family_body_1_material">sans-serif</string>
<string name="font_family_caption_material">sans-serif</string>
<string name="font_family_button_material">sans-serif-medium</string>

3

Bir TextView'i aynı font ailesine sahip çok sayıda yerde kullanmak istiyorsanız, TextView sınıfını genişletin ve yazı tipinizi şu şekilde ayarlayın: -

public class ProximaNovaTextView extends TextView {

    public ProximaNovaTextView(Context context) {
        super(context);

        applyCustomFont(context);
    }

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

        applyCustomFont(context);
    }

    public ProximaNovaTextView(Context context, AttributeSet attrs, int defStyle) {
       super(context, attrs, defStyle);

       applyCustomFont(context);
    } 

    private void applyCustomFont(Context context) {
        Typeface customFont = FontCache.getTypeface("proximanova_regular.otf", context);
        setTypeface(customFont);
    }
}

Ve sonra bu özel sınıfı xml'de TextView için şu şekilde kullanın: -

   <com.myapp.customview.ProximaNovaTextView
        android:id="@+id/feed_list_item_name_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        />

3

Android Studio 3.5+ kullanıyorsanız Yazı tipini değiştirmek son derece basittir. Tasarım görünümünde metin widget'ını seçin ve Öznitelik Penceresinde fontFamily öğesini kontrol edin. Değer açılır menüsü, seçebileceğiniz tüm yazı tiplerini içerir. Google Yazı Tipleri arıyorsanız, Diğer Yazı Tipleri seçeneğini tıklayın.

Özellik Penceresi Özellik Penceresi

Google Yazı Tipleri Google Yazı Tipleri


2

Sadece Android içindeki yazı tipleriyle cehennemin bitmek üzere olduğunu belirtmek istiyorum, çünkü bu yıl Google IO'da nihayet bunu aldık -> https://developer.android.com/preview/features/working-with-fonts. html

Şimdi yeni bir kaynak türü bir yazı tipi var ve tüm uygulama yazı tiplerini res / fonts klasörüne yerleştirebilir ve daha sonra R.font.my_custom_font ile erişebilirsiniz, tıpkı dize res değerlerine, çekilebilir res değerlerine vb. Erişebilirsiniz . özel yazı tiplerinizden (italik, kalın ve altı çizili attr hakkında) ayarlanacak yazı tipi yüz xml dosyası oluşturmak için.

Daha fazla bilgi için yukarıdaki bağlantıyı okuyun. Desteği görelim.


Ne yazık ki bu hala IntelliJ ile çalışmaz (Android Studio 3.0+ üzerinde bir cazibe gibi çalışıyor olsa da).
Dominikus K.

Evet, ancak Redmanyukarıdaki kullanıcı yanıtı hala çözümün gerekli bir parçası.
jungledev

2

Bunun için güzel bir kütüphane var

    implementation 'uk.co.chrisjenx:calligraphy:2.3.0'

Bu kütüphane, tüm uygulamadaki tüm görünümlerin yazı tipini değiştirmek için kullanılır. Bu, liste görünümü gibi adaptör görünümleri için geçerli değildir. Bunun için her bir adaptöre özel olarak kod eklememiz gerekiyor
Senthilvel S

2

Yeni yazı kaynak doğrudan ayarlamanızı sağlar fontkullanılarak

android:fontFamily="@font/my_font_in_font_folder"

1

Stili res/layout/value/style.xmlşu şekilde ayarladınız :

<style name="boldText">
    <item name="android:textStyle">bold|italic</item>
    <item name="android:textColor">#FFFFFF</item>
</style>

ve bu stili main.xmldosya kullanımında kullanmak için:

style="@style/boldText"

1

Android-studio 3 ve üstü için bu stili ve ardından textViewuygulamadaki tüm yazı tipi değişikliğini kullanabilirsiniz .

bu stili kendinizde oluşturun style.xml:

<!--OverRide all textView font-->
<style name="defaultTextViewStyle" parent="android:Widget.TextView">
        <item name="android:fontFamily">@font/your_custom_font</item>
</style>

Ardından temanızda kullanın:

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- 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:textViewStyle">@style/defaultTextViewStyle</item>
    </style>

1

Yazı tipini programlı olarak TextView'e eklemenin en kolay yolu , ilk olarak yazı tipi dosyasını projedeki Varlıklar klasörünüze eklemektir. Örneğin, yazı tipi yolunuz şöyle görünür:assets/fonts/my_font.otf

Ve bunu TextView'e şu şekilde ekleyin:

Kotlin

val font_path = "fonts/my_font.otf"  

myTypeface = Typeface.createFromAsset(MyApplication.getInstance().assets, font_path)

textView.typeface = myTypeface

Java

String font_path = "fonts/my_font.otf";
Typeface myTypeface = Typeface.createFromAsset(MyApplication.getInstance().assets, font_path)
textView.setTypeface(myTypeface);

0

Burada tüm mevcut fontFamily değerlerini ve karşılık gelen yazı tipi dosyasının adlarını görebilirsiniz (Bu dosya android 5.0 ve sonraki sürümlerinde kullanılıyor). Mobil cihazda şu konumda bulabilirsiniz:

/system/etc/fonts.xml (5.0+ için)

( Bu sürümü kullanarak android 4.4 ve altı için , ancak bunun fonts.xmldaha net bir formatı ve anlaşılması kolay olduğunu düşünüyorum .)

Örneğin,

    <!-- first font is default -->
20    <family name="sans-serif">
21        <font weight="100" style="normal">Roboto-Thin.ttf</font>
22        <font weight="100" style="italic">Roboto-ThinItalic.ttf</font>
23        <font weight="300" style="normal">Roboto-Light.ttf</font>
24        <font weight="300" style="italic">Roboto-LightItalic.ttf</font>
25        <font weight="400" style="normal">Roboto-Regular.ttf</font>
26        <font weight="400" style="italic">Roboto-Italic.ttf</font>
27        <font weight="500" style="normal">Roboto-Medium.ttf</font>
28        <font weight="500" style="italic">Roboto-MediumItalic.ttf</font>
29        <font weight="900" style="normal">Roboto-Black.ttf</font>
30        <font weight="900" style="italic">Roboto-BlackItalic.ttf</font>
31        <font weight="700" style="normal">Roboto-Bold.ttf</font>
32        <font weight="700" style="italic">Roboto-BoldItalic.ttf</font>
33    </family>

Name özelliği, name="sans-serif"içinde familyfontfamily: etiketi android kullanabileceğiniz değerini tanımladı.

fontEtiketi uymakta font dosyaları tanımlar.

Bu durumda, altındaki kaynağı yok sayabilirsiniz, <!-- fallback fonts -->yazı tiplerinin yedek mantığı için kullanılır.

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.