Calligraphy راه حلی برای تغییر فونت در اندروید

معمولا برای برنامه‌نویسان اندروید پیش اومده که بخواهند فونت برنامه رو به یه فونت فارسی تبدیل کنند و ظاهر برنامه‌شون رو با این کار قشنگ‌تر کنند. در آخرین کاری که انجام دادم به صورت نازیبایی همه TextView ،Button و … رو با استفاده از تابع setTypeface براشون فونت قرار دادم. دیگه بماند که نتونستم عنوان ActionBar و همچنین فونت Toastهای برنامه و چند المان دیگه رو عوض کنم.

گوگل کردم تا ببینم چه راه حل ساده‌تری وجود داره که خیلی زود Calligraphy رو پیدا کردم. در عنوان این کتابخانه در Github نوشته شده که راه حل ساده‌ای برای یک فونت دلخواه است. در ادامه متوجه خواهید شد که بله، واقعا ساده‌ست.
اول از همه خط زیر رو به build.gradle اضافه کنید:

compile 'uk.co.chrisjenx:calligraphy:2.1.0'

بزارید که gradle کار sync رو تموم کنه.

بعدش فونت مورد نظرتون رو به پوشه assets/ اضافه کنید. برای مثال من فونت IRANSansLight.ttf رو به پوشه fonts داخل پوشه assets اضافه کردم. اگر برنامه‌تون کلاس Application داره که بهتر، اگر نداره کلاس رو درست کنید. من کلاس MyApplication رو ایجاد کردم:

بعدش داخل تابع onCreate این سه خط رو اضافه کنید:

باید توی AndroidManifest کلاس MyApplication رو بهش معرفی کنید:

تقریبا کارمون تموم شده.
الان فقط باید در تمامی Activity برنامه خطوط زیر رو اضافه کنیم و تابع attachBaseContext رو به صورت زیر Override کنیم. مثلا به آخر کد Activity تابع زیر رو اضافه می‌کنیم:

تموم شد. برنامه‌تون رو اجرا کنید و از تغییراتی که به این سرعت پیدا کرده، لذت ببرید.

Calligraphy

چند نکته:

با این کار همه فونت‌‌های المان‌های برنامه رو عوض می‌کنید. (البته بعضی از کتابخانه‌هایی که به برنامه اضافه کردید ممکنه عوض نشه!!) شاید بخواید برای یک المان خاص یک فونت متفاوت قرار بدید، برای این کار مثلا برای یک TextView می‌تونید به این صورت داخل فایل Layout مورد نظر مقدار fontPath رو بهش اضافه کنید:

با استفاده از پارامتر fontPath مسیر فایل فونت متمایز رو وارد کنید و بقیه کار رو به کتابخانه واگذار کنید.
امکان تعریف فونت برای Style و Themeها هم وجود داره که مثلا با تغییر تم برنامه فونت برنامه به کل عوض بشه. می‌تونید برای بررسی و دیدن امکانات دیگه ش به لینک کتابخانه مراجعه کنید.

بهروز خضری

کارهای خیلی زیادی انجام دادم توو برنامه‌نویسی ولی خیلی‌هاشون بی‌ثمر بودن برام. سه سالی است که برنامه‌نویسی اندروید انجام میدم. زمینه اصلی فعالیتم در‌ GIS و کار بر روی داده‌های مکانی در اندروید است.

همچنین ممکن است دوست داشته باشید ...

۲۲ واکنش

  1. علی گفت:

    دستت درد کنه بهروز

  2. محمد گفت:

    عالی بود فقط اگه میشه یه اموزش و راهنمایی در مورد طراحی ui پیشرفته توضیح بدین به این صورت وقتی یه طرح داخل فتوشاپ زده میشه اون طرح رو با چه سایزی برش بدیم و در xml قرار بدیم

  3. عباس گفت:

    واقعا ممنون
    بسیار مفید بود

  4. مهیار گفت:

    عالی بود درست وسط یه پروژه در حالی که داشتم کله ام رو به دیوار می زدم اومدم شروع کردم به خوندن مطالب hive بعدش چی عالی عالی یه مطلب که بدرد می خوره !

  5. طه گفت:

    سلام من طبق مقاله مو به مو انجام دادم نمی دونم کجای کار اشتباهه
    بعد از انجام تمام مراحل در اخر این کد رو به TextView اضافه کردم
    fontPath=”fonts/IranianSans.ttf”
    که خطای
    (Attribute is missing the Android namespace prefix less… (Ctrl+F1
    Most Android views have attributes in the Android namespace. When referencing these attributes you must include the namespace prefix, or your attribute will be interpreted by aapt as just a custom attribute. Similarly, in manifest files, nearly all attributes should be in the android: namespace.
    که به نظرم میگه android: رو به اولش اضافه کن که انجام میدم ولی فرقی نمیکنه
    دوستانی که انجام دادن کمک کنن
    ممنون

    • بهروز خضری گفت:

      این دو خط رو به تعریف layout تون به parent اصلی مثلا relativelayout اضافه کنید:
      xmlns:android=”http://schemas.android.com/apk/res/android”
      xmlns:tools=”http://schemas.android.com/tools”

      • طاها قاسمی گفت:

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

  6. مصطفی نصیری گفت:

    بسیار عالی بود واقعا لذت بردم
    با آرزوی موفقیت روزافزون برای شما

  7. I.M.A.N گفت:

    بسیار خوب .. . ممنون از راهنمایی های خوبتون . . . موفق باشی

  8. عادل گفت:

    سلام
    این کتابخونه فونت TabHeader ها و فیلدهایی که در CustomListViewItem قرار دارند (مثل یک TextView) رو تغییر نمیده.
    لطفا اگر کسی تست کرده و جواب گرفته ما رو هم در جریان بذاره شاید من اشتباه می کنم.

  9. Hossein گفت:

    سلام، من زیاد وارد نیستم، ولی وقتی که توی Activity این کارو میکنم فونت تغییر میکنه ولی تو AppCompatActivity فورس کلوز میده
    اگه میشه راهنمایی کنید
    ممنون

    • بهروز خضری گفت:

      سلام،
      اول مطمئن بشید که خطا از این Calligraphy هست. اگه ممکنه LogCat خطا رو بفرستید.

      • Hossein گفت:

        بله خوب دوتا پروژه ساختم یکی AppCompatActivity و یکی Activity رو دومی جواب داد
        و وقتی کد رو از AppCompatActivity پاک میکنم میاد
        و مطمئنم که مشکل ازCalligraphy هست
        اگه میشه شما توی پروژه ای که AppCompatActivity باشه امتحان کنید ببینید اصلا این لایبری این قابلیتو داره خیلی ممنون

  10. احمد گفت:

    سلام، سپاس از آموزشی که گذاشتید
    من مشکلی دارم و این است که من در مانیفست یک android:name دارم، و بخوام یک android:name دیگه اضافه کنم به مشکل بر میخورم،
    ممنون میشم راهنمایی کنید برای رفع مشکل
    با تشکر

  11. آناهیتا گفت:

    خدا خیرتون بدددددده…..مررررررررررررررسی

  12. sina گفت:

    با سلام و خسته نباشید ممنون بابت توضیحاتتون.
    من ازین لایبرری برای زبان انگلیسی که استفاده میکنم درست کار میکنه اما وقتی که یه فونت فارسی جایگزین کردم و آدرس دهی کردم دیگه فونت تغییری نمیکنه! اروری هم ندارم متوجه نمیشم چرا کار نمیکنه
    ممنون میشم اگر میشه راهنمایی بفرمائین

دیدگاهتان را بنویسید

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