تغییر فونت کل اپلکیشن اندروید به طور یکجا

اگر برنامه‌نویس اندروید باشید احتمالا میدونید که عوض کردن فونت تمام view ها کار مهمل و اعصاب خورد کنیه. روشهای مختلف عمدتا دردسر زیادی دارند و همشون طوریند که باید از ابتدای پروژه به فکر باشید، وگرنه مجبورید حسابی وقت تلف کنید. من اینجا میخوام روشی رو معرفی کنم که حتی بعد از اتمام پروژه هم بتونید با صرف دو دقیقه وقت فونت تمام اپلیکیشن رو عوض کنید. چجوری؟ اینجوری:

ابتدا یه کلاس به اسم FontsOverride بسازید و دقیقا به شکل زیر بنویسیدش:

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

 

 

حالا یه کلاس به اسم اسم اپلیکیشن میسازیم و به شکل زیر مینویسیم:

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");
    }
}

 

 

کار اصلی‌ای که در این کلاس انجام میدیم اینه که فونت رو برای چهار حالت default , monospace , serif , sans_serif تایید میکنیم. دقت کنید که هر کدوم از فونت‌هایی که تو این کلاس اسمشون رو نوشتیم باید دقیقا با همین اسم داخل فولدر assets وجود داشته باشه.

حالا داخل تگ application در manifest باید به android:name اسم کلاس Applicationی که نوشتم رو بدیم. برای مثال من که این کلاس رو داخل پکیج utils نوشتم این ویزگی رو به این شکل تغییر میدم:

<application
        android:name=".utils.Application"
        .
        .
        .
        .
        >

 

خب به آخرش رسیدیم. حالا تنها کاری که باید بکنیم اینه که تو styles مشخص کنیم که میخوایم از کدوم فونت استفاده کنیم. برای مثال من میخوام که اپلیکیشنم از فونت monospace استفاده کنه:

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

 

خب به انتهای کار رسیدیم. از تعییر فونت به همین سادگی لذت ببرید.

در اندروید ۵.۰ (API 21) ممکنه که کمی مشکل داشته باشید. مشکل به این خاطره که این روش با تم android:Theme.Material.Light سازگار نیست. برای حل این مشکل از تم قبلی استفاده کنید:

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

البته در اندروید ۵.۱ این مشکل هم حل شد و این روش بدون نیاز به تغییر تم کار خواهد کرد.

11 پاسخ به “تغییر فونت کل اپلکیشن اندروید به طور یکجا”

  1. یحیی گفت:

    خیلی جالب بود، نمیدونستم همچین کاری هم میشه کرد! باعث شدی دنیا به جای بهتری تبدیل بشه. ممنون.

  2. علی گفت:

    اع
    واسه خوندن یه چیز دیگه اومدم اینجا و این ارتیکلو دیدم خیلی خوب بود خیلی بدردم میخوره مرسی مهندس 🙂

  3. میثم گفت:

    مهندس جان دمت گرم… خیلی عالی بود

    خیلی به دردم خورد
    BIG LIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK 👌👍👌👍👌👍

  4. z گفت:

    ممنون از شما ولی کرش کرد برنامه

  5. سعید گفت:

    در منیفست android:name=”.utils.Application ارور میده
    شما اولش نقطه گداشتی . نقطه رو که برمیداری درست میشه الان باید نقطه باشه یا اشتباه میکنم

    monospace
    این ایتم در استایل مینویسی ارور میده
    شما در جاوا حروف بزرگ نوشتید در استایل حروف کوچیک!
    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”);

    در هر صورت من حروف بزرگم امتحان کردم کلا ارور میده
    دو روز دارم با این کدا سرکله میزنم همش ارور میده ی راهنمایی میکنین

  6. میردامادی گفت:

    سلام
    خیلی ممنون از آموزشتون
    من متوجه نشدم که style را کجا بسازم و چه جوری ازش استفاده کنم
    اگه ممکنه یکم بیشتر توضیخ بدید
    ممنون

  7. pouya گفت:

    مرسی عالی بود
    ممنون که کمک میکنید دنیا جای بهتری برای زندگی بشه
    نوشته هاتون عالیه

  8. حامد گفت:

    سلام خوب هستین
    ممنون بابت آموزش های خوبتون
    من اینو امتحان کردم ولی جواب نداد در واقع من میخواستم نوشته های TabLayout رو فونت بدم ولی نشد چیکار کنم؟؟؟ خواهشا راهنمایی کنین
    ممنون

  9. hassan گفت:

    سلام ممنون بابت اموزش هاتون.
    تو manifest به جای نیمutils نیم پرژه را بنوسم یا کدام activity asli را منمون میشم

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

android application Google I/O HomeBrew ImageMagick Material Design mobile PogressBar RecyclerView splash TEDxKish ux آموزش اندروید الوین تافلر اندروید اپلیکیشن برنامه نویسی برنامه نویسی اندروید برنامه‌نویسی برنامه‌نویسی اندروید تداکس کیش تعمیر تغییر سایز عکس با ترمینال خلاصه کتاب دانش داده دانشگاه دانشگاه ایده‌آل دزد دیتا ساینس رشته مهندسی کامپیوتر ریکامندرسیستم سیستم‌های توصیه‌گر فری‌لنس لپتاپ متریال دیزاین معرفی کتاب موج سوم نوار پیشرفت همایش هوش مصنوعی ُجزیره کیش کار کسب و کار یادگیری عمیق یادگیری ماشین