Android'de bütün bir uygulama için özel yazı tipi nasıl ayarlanır?


83

Bir Android uygulamasında özel bir yazı tipi ayarlamak mümkün mü?

Ben yayınlanmıştır ne denedik burada , ama benim nerede bilmiyorum extends Applicationsınıftır ...

Herhangi bir yardım?

DÜZENLE:

Aşağıdakileri denedim:

  • Bir varlık klasörü ekleyin ve yazı tipini burada görüldüğü gibi ekleyin:

görüntü açıklamasını buraya girin

  • Genişleyen yeni bir sınıf ekleyin Application

  • Bu yeni sınıfı benden arayın AndroidManifest.xml.

  • Tarzıma gittim ve ekledim.

MyApp.java:

public class MyApp extends Application {
  @Override
  public void onCreate() {
     super.onCreate();
    FontsOverride.setDefaultFont(this, "DEFAULT", "raleway_regular.ttf");
    //  This FontsOverride comes from the example I posted above
  }
  }

AndroidManifest.xml:

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

styles.xml:

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

Ama yazı tipim hala değişmiyor ... herhangi bir fikriniz var mı?

Ardından MyAppsınıf çağrılır. Ama yazı tiplerimde bir etkisi yok ...

DÜZENLEME2: Düğmelerim için özel bir stil ayarladıktan sonra düğmelerimin özel yazı tipini uyguladığını fark ettim. İşte benim özel düğme stilim:

<style name="MyButtonStyle" parent="Widget.AppCompat.Button">
    <item name="textAllCaps">false</item>
    <item name="android:textAllCaps">false</item>
</style>

Ve işte şimdi nasıl göründüğü:

görüntü açıklamasını buraya girin

Yani: düğmem stili uyguluyor, ancak TextView. Özel yazı tipimin uygulamadaki tüm öğeler için neden uygulanmadığına dair bir fikriniz var mı?


söz konusu bağlantı, sorununuz için gerçekten yararlıdır.
Androider

Biliyorum, sanırım çözümüm orada ... Ama Uygulamadan
genişleyen bir

cevabım biraz daha bağlantıları ödeme, yararlı gibi görünüyor, bir şey daha benim ilk bağlantı, gerçekten iyi teşekkürler olduğunu
Androider

Yanıtlar:


50

Bir sınıf yazın

public class MyApp extends Application{
// Put the onCreate code as you obtained from the post link you reffered
}

şimdi sonraki şey AndroidManifest.xml'de uygulama etiketi için uygulama sınıfınıza ad verin. Bu durumda benimUygulamam

<application
android:name=".MyApp"
...
>
...
</application>

Böylece, Uygulama her açıldığında, MyApp sınıfının onCreate yöntemi çağrılacak ve yazı tipi ayarlanacaktır.

Put font dosyasını assets / fonts / your_font_file.ttf altında güncelleyin

Bu satırı uygulama sınıfınızın (MyApp) onCreate yönteminin altına koyun

TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/your_font_file.ttf");

TypefaceUtil için Kaynak Dosya

public class TypefaceUtil {

    /**
     * Using reflection to override default typeface
     * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE OVERRIDDEN
     *
     * @param context                    to work with assets
     * @param defaultFontNameToOverride  for example "monospace"
     * @param customFontFileNameInAssets file name of the font from assets
     */
    public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {

        final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Map<String, Typeface> newMap = new HashMap<String, Typeface>();
            newMap.put("serif", customFontTypeface);
            try {
                final Field staticField = Typeface.class
                        .getDeclaredField("sSystemFontMap");
                staticField.setAccessible(true);
                staticField.set(null, newMap);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else {
            try {
                final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
                defaultFontTypefaceField.setAccessible(true);
                defaultFontTypefaceField.set(null, customFontTypeface);
            } catch (Exception e) {
                Log.e(TypefaceUtil.class.getSimpleName(), "Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
            }
        }
    }
}

Şimdi style.xml dosyanızı güncelleyin

manifest dosyasına aktiviteniz için dahil edilen stilinizi aşağıdaki satıra koyun

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

Bu yardımcı olur umarım


Lütfen test ettiğiniz Android işletim sistemi sürümünüzü bildirin. Lolipopta daha fazla tweeks yapmamız gerektiğini gözlemledim
Nitin Mesta

Lütfen Lollipop ve önceki Android sürümlerine yönelik çözüm için aşağıdaki bağlantıyı kontrol edin: ( stackoverflow.com/a/36206275/2268466 )
blueware

tost mesajında, uyarı iletişim kutusundaki tüm uygulama yazı tipini değiştirir, bunda özel yazı tipini kullanmak istemiyorum
Adil

1
Şüphem var, pek çok üretici kullanıcının sistem genelinde yazı tiplerini ayarlardan değiştirmesine izin veriyor. Bu değişiklik, programlı olarak belirlediğimiz yazı tipi tipimizi de geçersiz kılıyor mu?
Bhuro

Birden Çok Yazı Tipi ayarlamak ne olacak?
Gaurav Mandlik

82

DÜZENLE

uk.co.chrisjenx:calligraphyLib, en son android sürümü alternatifi için daha fazla korunmuyor https://github.com/InflationX/Calligraphy

dependencies {
    implementation 'io.github.inflationx:calligraphy3:3.1.1'
    implementation 'io.github.inflationx:viewpump:2.0.3'
}

Özel yazı tiplerinizi varlıklara ekleyin /

Kullanım

Varsayılan yazı tipi için

#OnCreate () yöntemindeki Uygulama sınıfınızda CalligraphyConfig kullanarak varsayılan yazı tipinizi tanımlayın ve bunu ViewPump oluşturucunuza eklediğiniz CalligraphyInterceptor'a iletin.

@Override
public void onCreate() {
    super.onCreate();
    ViewPump.init(ViewPump.builder()
        .addInterceptor(new CalligraphyInterceptor(
                new CalligraphyConfig.Builder()
                    .setDefaultFontPath("fonts/Roboto-RobotoRegular.ttf")
                    .setFontAttrId(R.attr.fontPath)
                    .build()))
        .build());
    //....
}

Bağlama Dahil Et: Etkinlik Bağlamını Sarın:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));
}

Özel Stil

<style name="TextViewCustomFont">
    <item name="fontPath">fonts/RobotoCondensed-Regular.ttf</item>
</style>

Tema için

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:textViewStyle">@style/AppTheme.Widget.TextView</item>
</style>

<style name="AppTheme.Widget"/>

<style name="AppTheme.Widget.TextView" parent="android:Widget.Holo.Light.TextView">
    <item name="fontPath">fonts/Roboto-ThinItalic.ttf</item>
</style>

Çözümü Altındaki Geliştiriciler tarafından daha fazla korunmuyor


Android'de özel yazı tipleri için harika bir kitaplık var: Kaligrafi
İşte nasıl kullanılacağına dair bir örnek.

Gradle'da bu satırı uygulamanızın build.gradle dosyasına eklemeniz gerekir:

        dependencies {
            compile 'uk.co.chrisjenx:calligraphy:2.2.0'
        }

Ve sonra Uygulamayı genişleten bir sınıf oluşturun ve bu kodu yazın:

        public class App extends Application {
            @Override
            public void onCreate() {
                super.onCreate();

                CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                                .setDefaultFontPath("your font path")
                                .setFontAttrId(R.attr.fontPath)
                                .build()
                );
            }
        } 

Varlıklar / a "Yeni Dizin" "yazı tipleri" (aşağıya bakın) üzerinde yapmış olmalısınız, bu nedenle bu kodda "yazı tipi yolunuz" "fonts / SourceSansPro-Regular.ttf" olmalıdır. (Yalnızca "yazı tipleri ..." değil "/ fonts .." veya "varlıklar ..")

Ve etkinlik sınıfında bu yöntemi onCreate'den önce koyun:

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

Ve manifest dosyanızın şu şekilde görünmesi gereken son şey:

        <application
           .
           .
           .
           android:name=".App">

Ve tüm etkinliği yazı tipinize göre değiştirecek! basit ve temiz!

Varlıklar'da Yeni Dizin'e sağ tıklayıp "yazı tipleri" olarak adlandırmalısınız. Bulucuda .ttfyazı tipi dosyalarını oraya koyun .

görüntü açıklamasını buraya girin

Ayrıca attrs.xml'de iki satırın altına eklemeyi unutmayın, eğer attrs.xml dosyanız yoksa, values.xml'de yeni dosya oluşturun.

 <attr format="string" name="fontPath"/> 
    <item name="calligraphy_tag_id" type="id"/>

Ttf kullanıyorum ancak .otf'nin de çalışacağından ve varlıklar klasörüne koymak için en iyi konumdan eminim.
Rajesh Nasit

Bunu genişletilmiş Uygulama sınıfına yerleştirin CalligraphyConfig.initDefault (new CalligraphyConfig.Builder () .setDefaultFontPath ("fonts / GOTHAM-MEDIUM.ttf") .setFontAttrId (R.attr.fontPath) .build ()); Ayrıca values.xml <attr format = "string" name = "fontPath" /> <item name = "calligraphy_tag_id" type = "id" />
Rajesh Nasit

merhaba @rajesh! "Düzenle" yi tıklamanız ve bunu harika cevabınıza eklemeniz gerekir! haklısın, .ttf dosyası olmalı , üzgünüm.
Şişko

1
Parçayı mümkün olduğunca maksimum kullanabilirsiniz. Böylece bu aktivite sayısı azalacak.
Rajesh Naşit

1
@Pawan'ın bunu bir adımda yapması - attachBaseContext(..)uygulandığı yerde basit bir temel sınıf tanımlıyorum ve ardından tüm proje Aktivite sınıflarım (bu özel yazı tipini istediğim yer) bu temel sınıfı genişletiyor
Gene Bo

65

Tek yaptığım şuydu:

1: RES klasörüne "yeni kaynak dizini" eklendi, verilen açılır menüden "yazı tipi" olarak seçilen KAYNAK TÜRÜ, yeni dizine "yazı tipi" olarak adlandırıldı ve kaydedildi. YENİ KAYNAK REHBERİ

2: "custom_font.ttf" dosyamı yeni oluşturulan FONT klasörüne ekledim.

3: STYLES.XML'deki uygulama temel temasına özel yazı tipimi ekledim

STYLES.XML

YAPILDI.


4
Ayrıca bir yazı tipi ailesi oluşturmalısınız. Ondan sonra benim için çalıştı. Ayrıntılar burada: developer.android.com/guide/topics/ui/look-and-feel/…
keybee

bir yazı tipi ailesi oluşturmak zorunda kalmadan benim için çalıştı. Ancak, Gradle sürüm> 3'ü kullanmam ve araçlar oluşturmam ve 27> @keybee
Numanqmr

Yazı tipi ailesi olmasa bile benim için harika çalıştı
Julian Alberto

bunu programlı olarak nasıl değiştireceğinizi biliyor musunuz?
majov

@majov yukarıdaki cevabı #Rajeesh ile kontrol edin. bu size yardımcı olmalı!
Numanqmr

12

Sen seti / 2017 yılında yayınlanan Android Geliştirici resmi youtube kanalı olarak, şimdi android SDK ile bunu yapabilirsiniz burada .

API Level 26 (Android 8 Oreo) ve üstü gerektirir.

Sadece yazı tipi dosyanızı res/fontklasöre TextViewkoymanız ve android:fontFamilyözniteliğe sahip belirli bir dosyaya ihtiyacınız olması durumunda bunlara başvurmanız gerekir .

Uygulamanızın tamamında temel bir yazı tipi istiyorsanız,

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

senin içinde styles.xml

İsterseniz Android Studio'dan ve hareket halindeyken de özel bir yazı tipi indirebilirsiniz. Bunların hepsini yukarıdaki videoda ayrıntılarla bulabilirsin.


Bu seçenek API 26 ve üzeri içindir. 16+ Değil
Perfect Square

API 23 + için düzeltmeye ne dersiniz?
Raju yourPepe

12

Android, Destek Kitaplığı 26+ tarafından API seviyesi 14 üzerinde desteklenen daha basit ve en iyi çözümleri sağlar. XML'deki yazı tipleri Ayrıca yazı tipi ailesi seçeneğini de destekler . Gerekli içe aktarma: implementation "com.android.support:support-compat:<26+ version>"

Aşağıdaki basit adımları izleyin ve yazı tipi ailesi herhangi bir engel olmadan uygulamanıza uygulanacaktır:

  1. Res içinde bir yazı tipi dizini oluşturun
  2. Yazı tipi dosyanızı yazı tipinin içine yapıştırın
  3. Yazı tipi klasörüne sağ tıklayın ve Yeni> Yazı tipi kaynak dosyasına gidin. Yeni Kaynak Dosyası penceresi açılır.
  4. Aşağıdaki öznitelikleri ekleyin
<?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/lobster_regular" />
    <font
        android:fontStyle="italic"
        android:fontWeight="400"
        android:font="@font/lobster_italic" />
</font-family>
  1. Yukarıdaki xml dosyasında. Yalnızca destek kitaplığını kullanmak için uygulamayı kullanın . Aksi takdirde , uygulamanız API düzeyi 26+ 'yı hedefliyorsa android'i kullanabilirsiniz .
  2. Şimdi styles.xml dosyanıza gidin ve ana stilinizde satırın altına yazın.
    <item name="android:fontFamily">@font/opensans</item>
    
  3. Önemli: AppCompatActivity'yi yalnızca destek kitaplığı kullanıyorsanız kullanın .
  4. Veya yazı tipini programlı olarak ayarlamak için aşağıyı kullanın

    view.setTypeface(ResourcesCompat.getFont(context, R.font.opensans));
    

Bu, mevcut Android Yazı Tipi Kaynağı özelliği ile uygundur. Teşekkürler.
azwar_akbar

2

Kullandığınız gibi görünüyor android:fontFamilyyerine android:typefaceadresinden in styles.xml.

Değiştirmeyi deneyin

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

ile

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:typeface">default</item>
</style>

1
Ve bunu uygulamama nasıl bağlarım? Kim ondan uzanıyor?
Sonhja

Pekala, genişleterek Application, Uygulamanızın sınıfının bir alt sınıfını oluşturuyorsunuz Application. Yani bağlamanıza gerek yok.
Suhas

Hiç kullanılmadığını ne söylüyor?
Suhas

Aynı SO gönderisinde önerildiği gibi , Uygulamanızın dosyasının <item name="android:typeface">default</item>içine de satır eklediniz mi ? <style name="AppTheme" parent="AppBaseTheme">res -> values -> styles.xml
Suhas

Evet ve bu da çalışmıyor. Ben de düzenlememe koyduğum şey bu ... :(
Sonhja

2

İlk konuyu takip ederseniz, bu işe yaramalıdır: Burada

Evet yansımayla. Bu işe yarar ( bu cevaba göre ):

(Not: Bu, özel yazı tiplerinin desteklenmemesi nedeniyle geçici bir çözümdür, bu nedenle bu durumu değiştirmek istiyorsanız, lütfen buradan android sorununu yukarı oylamak için yıldız yapın). Not: Bu konuda "ben de" yorumları bırakmayın, ona bakan herkes bunu yaptığınızda bir e-posta alır. Bu yüzden sadece "yıldızla" lütfen.

import java.lang.reflect.Field;
import android.content.Context;
import android.graphics.Typeface;

public final class FontsOverride {

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

protected 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();
    }
}
}

Daha sonra birkaç varsayılan yazı tipini aşırı yüklemeniz gerekir, örneğin bir uygulama sınıfında:

public final class Application extends android.app.Application {
    @Override
    public void onCreate() {
        super.onCreate();
        FontsOverride.setDefaultFont(this, "DEFAULT", "MyFontAsset.ttf");
        FontsOverride.setDefaultFont(this, "MONOSPACE", "MyFontAsset2.ttf");
        FontsOverride.setDefaultFont(this, "SERIF", "MyFontAsset3.ttf");
        FontsOverride.setDefaultFont(this, "SANS_SERIF", "MyFontAsset4.ttf");
    }
}

Veya aynı yazı tipi dosyasını kullanıyorsanız, bunu yalnızca bir kez yüklemek için geliştirebilirsiniz.

Bununla birlikte, sadece birini geçersiz kılma eğilimindeyim, "MONOSPACE" diyorum ve ardından bu yazı tipi yazı tipi uygulamasını geniş bir şekilde zorlamak için bir stil ayarlıyorum:

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

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <item name="android:typeface">monospace</item>
    </style>
</resources>

API 21 Android 5.0

Yorumlarda çalışmadığını ve android teması Theme.Material.Light ile uyumsuz göründüğüne dair raporları inceledim.

Bu tema sizin için önemli değilse, daha eski bir tema kullanın, örneğin:

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:typeface">monospace</item>
</style>

2
  1. Başlangıçta, proje kaynaklarınıza sağ tıklamalısınız, resardından newseçenekten Android Resource Directoryseçip fontformu seçin ve Resource typeTamam'a basın, bu, yazı tiplerinizi yerleştirmek için yazı tipi dizini oluşturacaktır.

görüntü açıklamasını buraya girin

  1. .ttfYazı tipi dosyalarınızı oraya koyun .

görüntü açıklamasını buraya girin

  1. Aşağıdaki yolda bulunan proje stil dosyasına gidin res/values/styles.xml ve buna benzer stiller ekleyin:

    <style name="SansSerifFont">
        <item name="android:fontFamily">sans-serif</item>
    </style>
    
    <style name="OpenSansFont">
        <item name="android:fontFamily">@font/open_sans</item>
    </style>
    
    <style name="IranianSansFont">
        <item name="android:fontFamily">@font/iranian_sans</item>
    </style>
    
    <style name="BYekanFont">
        <item name="android:fontFamily">@font/b_yekan</item>
    </style>
    
    <style name="DroidArabicFont">
        <item name="android:fontFamily">@font/droid_arabic</item>
    </style>
    
  2. Tüm uygulama yazı tipini değiştirmek için kodunuza gidin ve buna benzer bir sınıf yazın:

    public class AppFontManager {
    
        private AppCompatActivity appCompatActivity;
    
        public static final String SANS_SERIF_APP_FONT = "sans_serif";
        public static final String B_YEKAN_APP_FONT = "b_yekan";
        public static final String DROID_ARABIC_APP_FONT = "droid_arabic";
        public static final String IRANIAN_SANS_APP_FONT = "iranian_sans";
        public static final String OPEN_SANS_APP_FONT = "open_sans";
    
        public AppAppearanceManager(AppCompatActivity appCompatActivity) {
            this.appCompatActivity = appCompatActivity;
        }
    
        public void setFont(String fontName){
    
            switch (fontName){
    
                case SANS_SERIF_APP_FONT:{
                    appCompatActivity.getTheme().applyStyle(R.style.SansSerifFont, true);
                    break;
                }
    
                case B_YEKAN_APP_FONT:{
                    appCompatActivity.getTheme().applyStyle(R.style.BYekanFont, true);
                    break;
                }
    
                case DROID_ARABIC_APP_FONT:{
                    appCompatActivity.getTheme().applyStyle(R.style.DroidArabicFont, true);
                    break;
                }
    
                case IRANIAN_SANS_APP_FONT:{
                appCompatActivity.getTheme().applyStyle(R.style.IranianSansFont, true);
                    break;
                }
    
                case OPEN_SANS_APP_FONT:{
                    appCompatActivity.getTheme().applyStyle(R.style.OpenSansFont, true);
                    break;
                }
            }
        }
    }
    

    Yazı tiplerinin her aktivite için ayrı ayrı ayarlanması gerektiğinden , daha temiz bir kod için onun için bir sınıf yazmayı tercih ederim.

  3. Daha sonra onCreate etkinliğinden önce sınıf yöntemini çağırın super.onCreate(savedInstanceState):

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        new AppAppearanceManager(this).setFont(APP_DEFAULT_FONT);
        super.onCreate(savedInstanceState);
    // Do you stuff there...
    }
    

    Eğer sırasında yazı tipini değiştirerek isterseniz unutmayın çalışma zamanı , bir seçilmiş yazı yazmak SharedPreferencesya da vb sonra tüm etkinliklere seçilen yazı tipini geçmesi setFontyukarıdaki gibi.


1

İçindeki ana klasör.add fontları klasöründe varlıklar klasörü oluşturun. .ttf dosyanızı fontlar klasörüne ekleyin.

Uygulamanızın Temasına aşağıdakileri ekleyin:

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

TypefaceUtil olarak sınıf oluştur

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

import java.lang.reflect.Field;

public class TypefaceUtil {

    /**
     * Using reflection to override default typeface
     * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE OVERRIDDEN
     * @param context to work with assets
     * @param defaultFontNameToOverride for example "monospace"
     * @param customFontFileNameInAssets file name of the font from assets
     */
    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) {
            Log.e("Can not set","Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
        }
    }
}

Uygulama sınıfında veya Başlatıcı etkinliğinde arayın

        TypefaceUtil.overrideFont(getApplicationContext(), "fonts/roboto_regular.ttf", "fonts/roboto_regular.ttf"); // font from assets: "assets/fonts/Roboto-Regular.ttf

0

Öncelikle, özelleştirmek istediğiniz Görünümü geçersiz kılan yeni bir sınıf oluşturun. (ör Button. özel yazı tipine sahip bir Düğme mi istiyorsunuz? Genişletin ). Örneğin:

public class CustomButton extends Button {
    private final static int ROBOTO = 0;
    private final static int ROBOTO_CONDENSED = 1;

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

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        parseAttributes(context, attrs); //I'll explain this method later
    }

    public CustomButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        parseAttributes(context, attrs);
    }
}

Şimdi, yoksa, altına bir XML belgesi res/values/attrs.xmlekleyin ve şunu ekleyin:

<resources>
    <!-- Define the values for the attribute -->
    <attr name="typeface" format="enum">
        <enum name="roboto" value="0"/>
        <enum name="robotoCondensed" value="1"/>
    </attr>

    <!-- Tell Android that the class "CustomButton" can be styled, 
         and which attributes it supports -->
    <declare-styleable name="CustomButton">
        <attr name="typeface"/>
    </declare-styleable>
</resources>

Tamam, öyleyse bunun dışında, parseAttributes()yönteme daha önce geri dönelim :

private void parseAttributes(Context context, AttributeSet attrs) {
    TypedArray values = context.obtainStyledAttributes(attrs, R.styleable.CustomButton);

    //The value 0 is a default, but shouldn't ever be used since the attr is an enum
    int typeface = values.getInt(R.styleable.CustomButton_typeface, 0);

    switch(typeface) {
        case ROBOTO: default:
            //You can instantiate your typeface anywhere, I would suggest as a 
            //singleton somewhere to avoid unnecessary copies
            setTypeface(roboto); 
            break;
        case ROBOTO_CONDENSED:
            setTypeface(robotoCondensed);
            break;
    }

    values.recycle();
}

Artık hazırsınız. Herhangi bir şey için daha fazla öznitelik ekleyebilirsiniz (typefaceStyle için başka bir tane ekleyebilirsiniz - kalın, italik, vb.) Ama şimdi nasıl kullanılacağını görelim:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/com.yourpackage.name"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.yourpackage.name.CustomButton
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me!"
        custom:typeface="roboto" />

</LinearLayout>

xmlns:customSatır gerçekten herhangi bir şey olabilir, ama kongre yukarıda gösterilen şeydir. Önemli olan, benzersiz olmasıdır ve bu nedenle paket adı kullanılır. Artık custom:özellikleriniz için android:ön eki ve android özellikleri için ön eki kullanırsınız.

Son bir şey: Bir stil (bu kullanmak istiyorsanız res/values/styles.xml), sen gerektiğini değil eklemek xmlns:customhattı. Önek olmadan özniteliğin adına referans verin:

<style name="MyStyle>
    <item name="typeface">roboto</item>
</style>

0

Yazı tipi geçersiz kılmayı da denedim ama sonunda güvenilir bir çözüm değil, ne yazık ki yazı tiplerini geçersiz kılmak bundan daha fazlasını alıyor. Özel yazı tipine sahip Android O'nun çıkmasını bekleyebilir veya üçüncü taraf bir kitaplık kullanabilirsiniz.

Karşılaştığım son çözüm, başlatması kolay olan ve istediğiniz kadar yazı tipi kullanmanıza izin veren bu Caligraphy kitaplığıydı . Kaynak kodunu kontrol ederken neden yazı tiplerini geçersiz kılmanın işe yaramayacağını anladım, bu yüzden kullanmayı planlamıyor olsanız bile bir kez okumanızı tavsiye ederim ..

İyi şanslar


Evet .. belki. Her neyse, bu sorunun arkasında bir neden bulursanız bize bildirin, gerçekten minnettar oluruz. Altta yatan kodları okurken bile bir çözüm bulamadım.
Keivan Esbati

0

Aşağıdaki kodu deneyin, benim için çalışıyor, umarım size de yardımcı olur.

public class BaseActivity extends AppCompatActivity {

private Typeface typeace;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    typeace = Typeface.createFromAsset(getAssets(), getResources().getString(R.string.font_name));
}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    overrideFonts(this,getWindow().getDecorView());
}

private 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(typeace);
        } else if (v instanceof EditText ) {
            ((EditText) v).setTypeface(typeace);
        } else if (v instanceof Button) {
            ((Button) v).setTypeface(typeace);
        }
    } catch (Exception e) {
 }
 }
}

Şimdi bu BaseActivity'yi Aktivitelerinizden herhangi birine genişletin veya kullanıyorsanız aynı sınıfı parça için oluşturabilirsiniz.

Not: - Görünümün bir kısmını farklı bir yazı tipi olarak ayarlamak istiyorsanız, bunu aşağıdaki gibi programlı olarak ayarlamanız gerekir.

private Typeface typeface;
typeface = Typeface.createFromAsset(getAssets(), getResources().getString(R.string.font_name_bold));
tvUserName.setTypeface(typeface);

Öyleyse bir dene ve bana haber ver, sana daha fazla yardımcı olabilirsem


0

Kotlin için bir çalışma bu olacak

Çözümün özeti https://gist.github.com/Johnyoat/040ca5224071d01b3f3dfc6cd4d026f7

Adım bir

Font dosyasını assets / fonts / your_font_file.ttf altına koyun ve TypeFaceUtil adlı bir kotlin sınıfı oluşturun

   class TypefaceUtil{

    fun overridefonts(context: Context, defaultFontToOverride:String, customFontFileNameInAssets:String){
        try {
            val customTypeface = Typeface.createFromAsset(context.assets,customFontFileNameInAssets)
            val defaultTypefaceField = Typeface::class.java.getDeclaredField(defaultFontToOverride)
            defaultTypefaceField.isAccessible = true
            defaultTypefaceField.set(null,customTypeface)
        }catch (e:Exception){
            Timber.e("Cannot set font $customFontFileNameInAssets instead of $defaultFontToOverride")
        }
    }
}

İkinci Adım Sonra seninonCreate

val typefaceUtil = TypefaceUtil()

typefaceUtil.overridefonts(this,"SERIF","fonts/font_file.ttf")

Adım üç

bunu tarzına ekle

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

0

Yazı tipi isimleri uygulamada ve çalışmada gösterilebilmesi için küçük harf olmalıdı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.