چطوری فونت تمام Widget های موجود توی اپلیکیشنمون رو کنترل کنیم

استاندارد

یه مشکلی که خیلی وقتا من رو تو پروژه‌هام اذیت میکرد تغییرات چند باره و چند باره‌ فونت widget هام  بود. مثلا فرض کنید یه پروژه رو تا انتها بردین جلو، حالا گرافیستتون یا مدیر پروژه میاد میگه اگه میشه فونت فلان جا رو عوض کن یا نمیدونم برای بعضی صفحات یه فونت دیگه ست کن. اگه توی این شرایط شما از اول پروژتون بفکر همچین سناریویی بوده‌اید که جای نگرانی نیست، ولی اگر نه باید بگم که احتمال اینکه اذیت بشید زیاده. اتفاقا همین چند روز پیش یکی از دوستام راجع به همین مسئله ازم پرسید و باعث شد این پست رو بنویسم و توش درباره این مشکل و راه‌حلی که براش استفاده میکنم بنویسم.

من این مشکل رو با استفاده از یه کتابخونه دم دستی به اسم CustomFontWidget که خودم نوشتم حل میکنم. این کتابخونه به شما این امکان رو میده که برای Widget هاتون فوفت‌های مختلفی رو ست کنید . ست کردن فونت‌ها از طریق xml هست و attribute ای به اسم customFont . همچنین شما میتونید یک فونت پایه برای پروژتون ست کنید که تمامی widget هاتون درصورتی که هیچ فونتی براشون ست نشده بود از اون استفاده کنن . فونت iran_sans هم برای استفاده در متن های فارسی به صورت default توی این کتابخونه وجود داره . به خواندن ادامه دهید

اضافه کردن هر attribute ای که دوست دارید به view دلخواهتون

استاندارد

تکه کد زیر رو در نظر بگیرید .

 

هرکدوم از این attribute ها نشان دهنده و مشخص کننده یک ویژگی خاص برای موجودیتی هستند که attribute برای اونها ست شده ، مثلا layout_height مشخص کننده ارتفاع موجودیت CustomTextView هست ، حالا ما چطور میتونیم بجز این attributeهای موجود attributeهای دیگه‌ای ایجاد کنیم ؟ یعنی یک attribute جدید که نشون دهنده یک ویژگی باشه که بصورت قراردادی خودمون مشخص کردیم . برای پاسخ به این سوال توی این پست ما ابتدا یه attribute دلخواه به شکل “custom:customFont=”fontname تعریف میکنیم و بعد از اون توی xml مون استفاده میکنیم . فقط بد نیست بدونید که این attribute ها رو میشه برای کلاسهای خود اندروید مثل TextView ساخت ولی از اونجایی که ما به کدهای این کلاسها دسترسی نداریم برای استفاده از این attributeها باید کلاس inflater دلخواه خودمون رو بنویسیم .

خب سخن کوتاه کنیم و بریم سر کد، واسه انجام اینکار ما اول باید فایل attrs.xml رو از زیر شاخه res/values/ باز کنیم و کد زیر رو توی اون بنویسیم.

کاری که کد بالا میکنه اینکه برای کلاس CustomTextView که قراره بنویسیم attribute ای به اسم customFont با فرمت string تعریف میکنه .

حالا میریم سراغ نوشتن کلاس CustomTextView . برای اینکار یه کلاس باهمین اسم میسازیم و از TextView ارث میبریم . بعد با خوندن attribute های ست شده برای کلاسمون و گرفتن customFont عملیات دلخواهمون رو با توجه به مقدار ست شده برای customFont انجام میدیم . که این عملیات توی این مثال ست کردن یک فونت دلخواه(مثلا Bnazanin) برای CustomTextView هست .

 

و در پایان میرسیم به نحوه استفاده از attribute ای که ساختیم توی xml . توی این مرحله تنها کاری که لازمه انجام بدیم اینکه namespace مربوط به attribute مون رو به xml اضافه کنیم. اینکار رو با اضافه کردن خط ۳ام از کد زیر انجام میدیم. و در اخر هم به راحتی از attribute ای که ساختیم استفاده میکنیم .

 

و حالا چیزی که در نهایت داریم یک کلاس CustomTextView هست که با attribute دلخواهی که براش ساختیم میتونیم توی فونتی که قرار هست براش ست بشه تغییر ایجاد کنیم .

نمایش دلخواه پیغام‌های خطا در اندروید

استاندارد

میتونم به جرأت بگم که کسی نیست که دستگاه اندرویدی داشته باشه یا با دستگاه‌های اندرویدی کار کرده باشه و پیغام زیر رو ندیده باشه !

Untitled

که مسلما پیغام خیلی دلچسبی هم براتون نبوده و نیست. مخصوصا اگه برنامه‌ نویسی اندروید میکنید. و مطمئناً تمام تلاشتون رو در طی پیاده‌سازی اپلیکیشنتون بکار میگیرید که کاربراتون با این پیغام روبرو نشن . ولی خب همیشه یه سری باگ‌های ریز و چموش هستند که از چشم برنامه‌نویسها به دور میمونند و باعث میشند این پیغام از طرف برنامه شما به کاربر نشون داده بشه. حالا با فرض وقوع این اتفاق (البته خدایی نکرده ) ، شاید شما دوست داشته باشید به جای اینکه کاربرتون این پیغام رو ببینه، پیغام دلخواه‌ای رو که شما متناسب با فضای برنامتون طراحی کردید رو ببینه. من توی این پست قراره مختصر توضیحی درباره چگونگی انجام این کار بدم . به خواندن ادامه دهید

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

استاندارد

من هم مثل خیلیا سعی میکنم توی کدهایی که میزنم از اصول و مفاهیم شی گرایی استفاده کنم و تنها نکته‌ای که این وسط تاحدی واسم آزار دهنده بوده (البته تا دیروز) این بود که وقتی برای یه کلاس با تعداد متغیرهای زیاد میخواستم توابع getter و setter  بنویسم کد کلاسهام خیلی شلوغ و بهم ریخته میشد! اوضاع وقتی وخیمتر میشد که چندتا constractor و toString و equal و  … هم به کلاس اضافه میشد . تا این که دیروز همکارم یه کتابخونه خیلی خوب بهم معرفی کرد که بوسیله annotation ها تمام کارای که تو بالا بهشون اشاره کردم رو بدون شلوغ کاریهای روش معمول انجام میده، البته بجز کارهایی که گفته شد خیلی کارای باحال دیگه هم انجام میده . مثل cleanup@ که با استفاده از اون برای کلاس‌هایی که متد close توی اونها پیاده سازی شده (کلاس‌های cloasable مثل InputStream  و OutputStream ‌و یا کلاس‌های مربوط به دیتابیس )،به شما این اطمینان رو میده که قبل از خارج شدن از scope کنونی که شما توی اون هستید، این متد(close ) رو به وسیله try/finally فراخوانی کنه . به خواندن ادامه دهید

استفاده از ایکون فونت در برنامه‌های اندرویدی

استاندارد

احتمالاً براتون پیش اومده که بخواین توی برنامه اندریدیتون از ایکون استفاده کنید. یه راه معمول برای انجام این کار استفاده از ایکون‌ها به صورت عکس هستش. که خب یسری دردسر‌هایی رو هم به همراه داره ! چندتا از این دردسر‌ها عبارت اند از: تغییر کیفیت عکس با تغییر سایز اون، سخت بودن تغییر رنگ یک ایکون و حجم نسبتاً زیادی که این فایل‌های عکس توی پروژه اشغال میکنند ، مخصوصاً زمانی‌ که شما بخواین از سایز‌های مختلف ایکون برای اندازه نمایشگر‌های متفاوت استفاده کنید .

خب یه راه حال دوم و بهتری هم وجود داره، اون هم استفاده از ایکون فونت هست که تقریبا اکثر مشکلات روش اول رو پوشش میده. توی این روش شما فقط یک فایل ttf رو توی پروژه خودتون ذخیره می‌کنید که به نسبت حجم خیلی‌ کمتری رو اشغال می‌کنه همچنین توی اندازه‌های مختلف دیگه مشکل افت کیفیت رو نخواهید داشت و به راحتی‌ می‌تونید رنگ ایکون مورد نظرتون رو توی کدتون عوض کنید.

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