خانه » لایبرری های مفید و تجربیات شخصی خیلی مفید !!! » ساخت PersianTextView در اندروید (textView با قابلیت تغییر فونت فارسی و فارسی کردن اعداد)

ساخت PersianTextView در اندروید (textView با قابلیت تغییر فونت فارسی و فارسی کردن اعداد)

حتما خیلی زیاد از setTypeface استفاده کرده اید ، و شاید به دنبال راهی بودید که بتونید یکبار یک فونت رو set کنید و بعد همیشه به صورت خودکار فونت ها ست شوند.

خوب برای این کار راه حلی هست ، همون طور که یک Custom View ساختیم میتونیم یک Custom TextView هم بسازیم و تغییراتی رو به TextView اندروید بدهیم تا از فونت مورد نظر ما استفاده کند.

در این آموزش کلاسی به اسم PersianTextView می سازم که کلاس TextView را extends می کند :

بعد از این کار و افزودن ۳ constructor این کلاس به شکل زیر می شود :

public class PersianTextView extends TextView {
    public PersianTextView(Context context) {
        super(context);
    }

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

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

}

خوب حالا با یک تغییر کوچیک میتونیم از شر همه ی setTypeface ها راحت بشیم :

public class PersianTextView extends TextView {
    public PersianTextView(Context context) {
        super(context);
        if (!isInEditMode())
            setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/XM Yekan.ttf"););
    }

    public PersianTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        if (!isInEditMode())
            setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/XM Yekan.ttf"););
    }

    public PersianTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if (!isInEditMode())
            setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/XM Yekan.ttf"););
    }

}

 

در اینجا setTypeface را فراخوانی می کنیم .
به همین سادگی ، حالا هرجایی که TextView داریم بجاش از PersianTextView استفاده می کنیم .

 

و اما کد if (!isInEditMode()) چیست ؟
زمان طراحی xml ها وقتی از کلاس های Custom شده استفاده می کنیم ، کامپایلر ها توانایی اجرای کد ها را ندارند و پیغام خطا می دهند
با این کد تعیین می کنیم فقط زمان اجرای برنامه این تغییر را اعمال کند .


این آموزش تموم شد اما می خوام کمی برنامه رو بهتر کنیم :
کدی که من ازش استفاده می کنم ۲ کلاس دیگر هم دارد :
کلاس FontHelper و FormatHelper
کلاس FontHelper برای این ساخته شده که فقط یک بار Typeface ساخته شود و در دفعات بعدی از همان Typeface قبلی که در مموری وجود دارد استفاده کند ، به کدهای این کلاس توجه کنید :

public class FontHelper {
    private static FontHelper instance;
    private static Typeface persianTypeface;

    private FontHelper(Context context) {
        persianTypeface = Typeface.createFromAsset(context.getAssets(), "fonts/XM Yekan.ttf");
    }

    public static synchronized FontHelper getInstance(Context context) {
        if (instance == null)
            instance = new FontHelper(context);
        return instance;
    }

    public Typeface getPersianTextTypeface() {
        return persianTypeface;
    }
}


کلاس FormatHelper هم کلاسی برای تبدیل اعداد به اعداد فارسی می باشد :


public class FormatHelper {
    private static String[] persianNumbers = new String[]{"۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹"};

    public static String toPersianNumber(String text) {
        if (text.isEmpty())
            return "";
        String out = "";
        int length = text.length();
        for (int i = 0; i < length; i++) {
            char c = text.charAt(i);
            if ('0' <= c && c <= '9') {
                int number = Integer.parseInt(String.valueOf(c));
                out += persianNumbers[number];
            } else if (c == '٫') {
                out += '،';
            } else {
                out += c;
            }

        }
        return out;
    }
}

 


و در آخر کد های PersianTextView :

 

public class PersianTextView extends TextView {
    public PersianTextView(Context context) {
        super(context);
        if (!isInEditMode())
            setTypeface(FontHelper.getInstance(context).getPersianTextTypeface());
    }

    public PersianTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        if (!isInEditMode())
            setTypeface(FontHelper.getInstance(context).getPersianTextTypeface());
    }

    public PersianTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if (!isInEditMode())
            setTypeface(FontHelper.getInstance(context).getPersianTextTypeface());
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        if (text != null)
            text = FormatHelper.toPersianNumber(text.toString());
        super.setText(text, type);
    }
}

در کد نهایی کلاس setText را هم Override کردم تا زمانی که متن درحال setText شدن هست قبل از نمایش بر روی آن تغییراتی ایجاد کنم (اعداد را فارسی کنم)
سپس دوباره متن تغییر داده شده را به super خود ارسال می کند.

نکته : فراموش نکنید که فایل فونت را درست تعریف کنید و آن را در فولدر assets قرار دهید.

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

برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

22 دیدگاه

  1. عالیه ، یه چیزای جدید یاد گرفتم

  2. سلام ممنون از آموزش های خوب تون

     

    قسمت super  در متد ها برای چیه اگه ننویسیم چی میشه ؟

    • super مربوط به برنامه نویسی جاوا هست

      در جاوا زمانی که قصد داریم یک متد رو که قبلا نوشته شده است ، مثلا در اندروید متد onCreate دوباره باز نویسی کنیم و از اون استفاده کنیم ، ۲ حالت پیش می آید ، یکی اینکه قصد داریم متدی که قبلا نوشته شده و محتوای توی اون اجرا شود و کد جدید ما هم اجرا شود در این حالت وقتی super را می نویسیم به کلاس والد رفته و متد موجود را فراخوانی می کند سپس پس از اجرای کد های درون آن نوبت به کد هایی می شود که ما اضافه کرده ایم ، اما اگر super صدا زده نشود فقط کد های جدید فراخوانی می شوند که ممکن است باعث ایجاد خطا شود و یک سری پروسس لازم که در متد اصلی بوده دیگر فراخوانی نشود .

      در کل این به بحث شی گرایی و پلی مرفیسیم در برنامه نویسی بر می گردد . توصیه می کنم برای اینکه بهتر متوجه بشید حتما یک کتاب جاوا بخونید

  3. سلام کدتون کار نمیده

  4. سلام ، تشکر بابت آموزش مفیدتون

    یک سوال داشتم : چرا وقتی از فونت های فارسی در برنامه نویسی اندروید استفاده میکنیم اون حس و حالی که انتظار داریم رو به ما نمیده ؟ بر فرض مثال فونت یکان در طراحی وب خیلی خوب خودشو نشون میده ولی اون حس و زیبایی رو وقتی در اندروید استفاده میکنیم به ما نمیده

  5. سلام
    من به صورت مرتب هر چند وقت یکبار به سایت شما سر میزنم ، ام همونطور که خودت درک میکنی ، یکم آدم تنبلیش میاد نظر بده ، اما بعد از بارها بازدید ، گفتم این دفعه با ثبت نظر اعلام وجود کنم و بگم از مطالب خوب شما حداکثر استفاده رو می کنم ، اینکه نظر نمیذاریم ، معنیش این نیست که مطلب بدرد نخورد یا بد بود ، برعکس مطالب عالی هستن ، امیدوارم این روند ادامه دار باشه.

  6. سلام 

    ممنون از بات آموزش خوبتان 

    من از این روش شما استفاده کردم اما وقتی برنامه رو اجرا می کنم برنامه کرش می کنه بخاطر اینکه مقدار تایپ سیف رو خالی برمی گردونه با وجود اینکه اون خط کد شما رو برای اینکه موقع اجرا تغییر ات اعمال بشه هم اضافه کردم 

    اما وقتی اون خط رو به این صورت اضافه می کنم خطا نمیده اما به نظرم دیگه فونت اعمال نمیشه 

    f (isInEditMode())

  7. سلام 

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

    (isInEditMode()) من این رو گذاشتم  (!isInEditMode())  

    در قسمت xml هم کلاس رو ست کردم یعنی

    <asgh.ir.radsemenar.Font.PersianTextView

     

    با تشکر

     

  8. سلام استاد عزیز

    بابت آموزشهای خوبتون ممنونم.

    در بالا فرمودید کتاب جاوا برای آشنایی بیشتر با متد super بخوانید

    شما چه کتابی را برای جاوا پیشنهاد می دهید؟

    ضمن اینکه بنده دقیقا نمی دونم جاوا بیشترین کاربردش تو اپلیکیشن هاست یا تو وب ؟

    ،و اینم می دونم که سرویس جیمیل با جاوا نوشته شده. 

    بنده خیلی به جاوا علاقه مندم اگه میشه یه منبع خوب فارسی بعدشم انگلیسی معرفی بفرمایید.

     

  9. ممنون از آموزش
    خیلی کمک کرد

  10. سلام روش استفاده از این کلاس چجوریه؟

  11. سلام و ممنون ازآموزش

    بنده تازه کارم 

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

    چجوری تو یک textview از این روش استفاده کنم

  12. سلام.وبسایتتون خیلی خوب و مفیده.به کارتون ادامه بدین

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا