پیاده‌سازی Bottom navigation در متریال دیزاین

استاندارد

توی پست قبلی کمی راجع‌به خود Bottom navigation صحبت کردیم و باید و نباید‌هایی رو که باید برای پیاده‌سازی در نظر داشته باشیم رو برسی کردیم . حالا وقتشه که کمی هم درباره پیاده‌سازی این مدل صحبت کنیم . توی این پست ما قراره یک Bottom navigation بسازیم با تب‌های خانه ، پروفایل و نقشه و به وسیله اون بین صفحات مختلف حرکت کنیم . برای انجام این کار از کتابخونه AHBottomNavigation استفاده میکنیم .

ابتدا کتابخونه رو به پروژمون اضافه میکنیم .

توی اولین مرحله لازمه صفحات خانه ، نقشه و پروفایلمون رو بسازیم. برای این کار یک Fragment ساده مثل کد زیر میسازیم و با استفاده از یک TextView مشخص میکنیم الان توی کدوم صفحه هستیم .

حالا باید یک Adapter برای تغییر ViewPager بنویسیم .

در مرحله بعدی صفحه‌ای که میخوایم توی اون از Bottom navigation استفاده کنیم رو میسازیم .

برای View اصلی بهتره که از CoordinatorLayout استفاده کنیم تا اگه خواستیم از المان‌های دیگه مربوط به متریال رو توی صفحه‌مون استفاده کنیم به مشکلی برنخوریم . همینطور بهتره از ViewPager خود کتابخونه استفاده کنیم وگرنه باید ViewPager مون رو طوری تغییر بدیم که با حرکت دست نشه بین صفحه‌های مختلفش حرکت کرد.

و در مرحله آخر Activity ای که قراره Bottom navigation توی اون نمایش داده بشه رو میسازیم .

در کد بالا آرایه‌ای از تب‌هامون رو با استفاده از AHBottomNavigationItem میسازیم و اون رو به AHBottomNavigation مون اضافه میکنیم .
تابع  ()bottomNavigation.setColored یک مقدار boolean دریافت میکنه که به وسیله اون مشخص میکنه که توی انتخاب تب‌ها رنگ Bottom navigatoin رو به رنگ استفاده شده در AHBottomNavigationItem تغییر بده یا نه .

و این هم چیزی خواهد بود که در نهایت خواهیم داشت .

Screenshot_2016-05-31-10-27-03

معرفی Snackbar در متریال دیزاین

استاندارد

Untitled

یکی از component های جالب و سبکی که گوگل توی متریال دیزان معرفیش کرد Snackbar بود . این component رو احتمالا توی اپ‌های خود گوگل مثل gmail و inbox  دیدید .
Snackbar دقیقا مثل Toast عمل میکنه ، با این تفاوت که به کاربر امکان انجام عملیات در داخل خودش رو میده ، مثلا اینکه درخواستی که توی پیام اومده رو رد یا قبول کنه .

در ادامه چگونگی ساخت snackbar رو برسی میکنیم .
برای قدم اول، فایل build.gradle پروژتون رو باز کنید و کد زیر رو بهش اضافه کنید .

کد زیر Snackbar ای میسازه که فقط یک متن رو نمایش میده .

sddsd تابع make سه پارامتر به عنوان ورودی میگیره ، پارامتر اول view پدر در layoutمونه که قراره توی اون Snackbar رو نمایش بدیم ، پارامتر دوم متنی هست که میخوایم نمایش بدیم و سومین پارامتر ،مدت زمانی هست که قراره snackbar به کاربرانمون نشون داده بشه .

نکته : برای پارامتر سوم بایستی از یکی از مقادیر LENGTH_SHORT, LENGTH_LONG  یا LENGTH_INDEFINITE استفاده کنیم و درصورتی که از LENGTH_INDEFINITE استفاده کنیم snackbar تا زمانی که به وسیله کشیدن از صفحه خارج نشه ، نشون داده خواهد شد .
نکته : در مستندات گوگل توصیه شده که برای view اصلی (پدر) که قراره snackbar در اون نمایش داده بشه  و به عنوان پارامتر اول به تابع make ارسال بشه از CoordinatorLayout استفاده کنید ، تا تمام قابلیت‌های پیش فرض snackbar مثل کشیدن برای از بین بردن ( swipe dissmiss ) و خارج شدن اتوماتیک از کنار صفحه قابل استفاده باشه .

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

توی بالا با استفاده از تابع setAction یک عملیات رو برای snackbar مون تعیرف میکنیم . تابع setAction دوتا ورودی میگیره ، اولی اسمی هست که میخوایم برای عملیاتمون نمایش بدیم و دومی یک onClickListener .
و در آخر اگه بخوایم رنگ متن‌های نمایش داده شده رو تغییر بدیم میتونیم از کد زیر استفاده کنیم .

sdsdsds

گرفتن دسترسی‌ها در زمان اجرا برای اندروید ۶

استاندارد

همونطور که احتمالا میدونید گوگل توی اندروید۶ یک مفهوم به اسم Runtime Premissoin یا گرفتن دسترسی در زمان اجرا رو معرفی کرد. که به نظر خیلی‌ها یکی از بهترین تغییرات در زمینه بالا بردن حس امنیت توی کاربرا بوده و قطعا میشه از اون به عنوان یه امکان بسیار خوب برای کاربرای نهایی اپلیکیشن‌ها نام برد . ولی خب همیشه قرار نیست هر تغییری برای همه خوشایند باشه ، و اینجا این موضوع برای دولوپرهایی که توی اپلیکیشن‌شون جاهای زیادی نیاز به گرفتن دسترسی دارند و میخوان از این مفهوم استفاده کنن، خیلی خوشایند نیست.

چه زمانی نیاز به دریافت دسترسی در زمان اجرا خواهیم داشت :

Permission‌های موجود در اندروید به دو دسته تقسیم میشند . دسته اول Normal Permission یا دسترسی‌های معمولی و غیر حیاتی مثل دسترسی به انترنت ( android.permission.INTERNET  ) که برای استفاده از اون‌ها فقط کافی مثل قبل و همونطور که توی کد بالا میبینید دسترسیتون رو داخل AndroidManifest بنویسید و بدون نیاز به گرفتن دوباره اون از کاربر در زمان اجرا ازش استفاده کنید .

دسته دوم Dangerous Permission یا دسترسی‌های خطرناک و حیاتی هستند مثل دسترسی نوشتن بر روی کارت حافظه و یا خوندن دفترچه تلفن که برای استفاده از این نوع دسترسی‌ها هم باید اون‌ها رو مثل دسترسی‌های معمولی داخل AndroidManifest قرار بدین ، هم در زمان اجرا از کاربران برای استفاده از این دسترسی اجازه بگیرید . اینجا میتونید لیستی از دسترسی‌ها و نوع اونها رو ببینید .

چطوری گرفتن دسترسی در زمان اجرا رو پیاده‌سازی کنیم :

 

device-2016-04-04-161253-1
معمولا وقتی اقدام به پرسیدن و گرفتن یک دسترسی از کاربر میکنم که بخوایم از اون استفاده کنیم . مثلا اگه بخوایم بر روی حافظه گوشی چیزی بنویسیم بهتره درست قبل از اینکه این کار رو بکنیم از کاربرمون این دسترسی رو بگیریم، که کاربرمون هم بتونه متوجه بشه که این دسترسی رو مشخصا برای انجام چه کاری قراره بده . کد زیر روند چک کردن دسترسی و در صورت موجود نبودن، اقدام به گرفتنش رو نشون میده .

توی کد بالا اول چک میکنیم و میبینیم اگه دسترسی نوشتن روی حافظه رو داشتیم تابع ()myPermissionNeededMethod رو که نیاز به این دسترسی داره رو اجرا میکنیم ، و اگر این دسترسی رو نداشتیم request ای میدیم تا کاربر بتونه دسترسی مورد نیازمون رو بهمون بده. حالا باید به یه طریقی بتونیم بفهمیم که آیا کاربرمون دسترسی که میخواستیم رو بهمون داده یا نه . این کار رو از طریق override کردن تابع ()onRequestPermissionResult توی Activity یا Fragment مون میکنیم .

توی کد زیر اول چک میکنیم که اگه کاربر دسترسی مورد نظرمون رو به ما داده بود ، تابع ()myPermissionNeededMethod که نیاز به این دسترسی داشت رو اجرا میکنیم و اگر کاربر این دسترسی رو به ما نداده بود میتونیم متناسب با کاری که قرار بود اجرا بشه پیامی به کاربر نشون بدیم و اقدام‌های لازم رو انجام بدیم .

نکته مهم : این نوع دریافت دسترسی فقط و فقط زمانی لازم میشه که اپلیکیشن شما SDK هدفش ۲۳ باشه (targetSdkVersion 23 ) و کابر شما اندروید ۶ یا بالاتر روی گوشیش داشته باشه .

بهینه کردن مصرف Memory توسط تصاویر در اندروید

استاندارد

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

اینجا میخوایم باهم دو نکته ساده که به وسیله اونها می‌تونیم مصرف Memory تصاویرو بهبود بدیم رو برسی کنیم . به خواندن ادامه دهید

معرفی کتابخانه Picasso همراه با مثال

استاندارد

Picasso یکی از معروف‌ترین و پرکاربردترین کتابخونه‌های اندرویدیه و همونجور که واضحه اسمش رو از نقاش اسپانیایی، پابلو پیکاسو به ارث برده . کاری این کتابخونه انجام میده، ساده‌تر کردن دانلود و cache کردن تصاویریه که  قراره تو اپلیکیشنتون ازشون استفاده کنید. به زبان دیگه بجای اینکه بخواید خودتون کدی بنویسید که به وسیله اون یک تصویر رو از سرور دریافت کنید و اگر خواستید بعد از دریافت اون رو داخل memory یا disk دستگاه‌تون chache کنید ، میتونید از ‌‌این کتابخونه استفاده کنید که این امکانات و امکانات دیگه‌ای رو در قالب یک پکیج کامل بهتون میده . در ادامه بخشی از امکانات Picasso رو  با هم برسی میکنم .

قبل از شروع هر کاری لازمه که کتابخونه رو داخل پروژه‌مون کامپایل کنیم. اینکار توسط خط زیر که به dependency های فایل gradle اضافه میکنیم انجام میشه .

  • خب بریم سر اصل مطلب ، تو ساده‌ترین حالت استفاده ما میخوایم یک تصویر رو از یک url دریافت کنیم و اون رو توی یک ImageView که از قبل ساختیم نشون بدیم

متد Load به عنوان ورودی هم url فایل توی سرور و هم url فایل درون گوشی رو قبول میکنه همچنین اگه تصویرتون توی resoruce پروژتون باشه میتونید id اون رو به عنوان ورودی به تابع load بفرستید .

  • اگر خواستید تصویر دانلود شده رو جایی خارج از ImageView ست کنید یا به طور کلی به bitmap دریافت شده توسط Picasso دسترسی داشته باشید می‌تونید مثل کد زیر عمل کنید .

  • به وسیله ست کردن یک تصویر برای متد ()placeHolder میتونید قبل از load شدن تصویر اصلی یک تصویر پیش فرض رو نشون بدین ، همینطور مثل متد ()placeHolder به وسیله متد ()error میشه در صورت بروز مشکل در روند دریافت تصویر یک تصویر متناسب رو نشون بدین .
  • تغییر اندازه و شکل تصویر به شکل دلخواهمون برای این کار خود Picasso توابعی رو در اختارمون گذاشته ، مثل ()ceneterCrop() , centerInside() , fit() , resize . که به وسیله اونها میتونیم شکل نمایش تصویر رو مشخص کنیم . مثلا تابع fit تصویر رو به اندازه‌ی ظرفی که قراره تصویرمون توی اون نشون داده بشه میکنه . همچنین علاوه بر موارد بالا شما میتونید کلاس Transformation دلخواه خودتون رو بسازید و تصویرتون رو به شکل‌های دلخواهتون تغییر بدین ، مثلا دو کلاس زیر رو میتونید برای گرد کردن تصویر و گرد کردن لبه‌های تصویر استفاده کنید .
    Screen Shot 2016-05-06 at 2.52.59 PM

تا اینجای کار بیشتر کارهای اصلیی رو که میشه با این کتابخونه انجام داد رو باهم برسی کردیم . اگه میخواین اطلاعات بیشتری راجع‌به این کتابخونه بدست بیارید پیشنهاد میکنم یه نگاهی به صفحه‌شون بندازید .
همینطور منم توی پست بعدی کمی راجع‌به چگونگی بهبود و کم کردن میزان مصرف memory توسط Picasso خواهم نوشت .