چگونه یک ویجت اندرویدی ساده بنویسیم؟

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

توی این آموزش ما میخوایم با اندروید استودیو یه ویجت اندرویدی بنویسیم که یه عدد رو بهمون نشون بده که به صورت خودکار بعد از یه مدت زمانی ، یا با تاچ شدن دکمه توسط کاربر ، مقدارش به صورت رندوم تغییر کنه. برای اینکه این آموزش رو خوب متوجه بشید باید با کلیات برنامه نویسی اندروید و محیط اندروید استودیو آشنایی داشته باشید.

قدم اول : ایجاد پروژه

خب ، قدم اول ایجاد پروژه توی اندروید استودیو هست. یه پروژه با نام دلخواه و اکتیویتی خالی ایجاد کنید. حداقل نسخه sdk رو هم روی ۱۵ تنظیم کنید.

قدم دوم : ایجاد و طراحی لی اوت (Layout) ویجت

هرچی فکر کردم واژه هم ارز مناسبی برای layout پیدا نکردم. “طرح بندی” هم میتونه واژه مناسبی باشه ؛ اما چون ممکنه گیج کننده باشه فعلا از همین لی اوت استفاده میکنیم. اگه پیشنهاد بهتری دارین حتما بگین تا استفاده کنیم. 😀

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

view های مجاز برای طراحی ویجت :

FrameLayout, LinearLayout, RelativeLayout, GridLayout, AnalogClock, Button, Chronometer, ImageButton, ImageView, ProgressBar, TextView, ViewFlipper, ListView, GridView, StackView, AdapterViewFlipper

خب یه لی اوت با اسم simple_widget.xml ایجاد کنید و کد های زیر رو داخلش بنویسید :

یک دکمه برای گرفتن اکشن از کاربر و یه TextView برای نمایش نتیجه توی لی اوتمون قرار دادیم.

قدم سوم : ایجاد meta data ویجیت

هر ویجت باید یه سری اطلاعات پایه ی مشخص داشته باشه. مثل حداقل طول و ارتفاع برای نمایش ، فاصله زمانی آپدیت شدن خودکار و … . این اطلاعات رو باید در یک فایل xml ذخیره کنیم و به برنامه بفهمونیم که این فایل اطلاعات پایه مربوط به ویجت برنامه ماست. برای این کار ، ابتدا یک فایل xml در آدرس res/xml (اگه پوشه xml وجود نداره اون رو دستی ایجاد کنید.) با اسم simple_widget_info.xml ایجاد کنید و کد های زیر رو داخلش بنویسید :

minWidth : حداقل طول ویجت

minHeight : حداقل ارتفاع ویجت

updatePeriodMillis : مدت زمان دوره آپدیت خودکار بر حسب میلی ثانیه (توجه داشته باشید که حداقل زمان  ۳۰ دقیقه معادل ۱۸۰۰۰۰ میلی ثانیه است. اگه به دوره های زمانی کوتاه تری نیاز دارید میتونید از TimerTask استفاده کنید.)

initialLayout : فایل لی اوت ویجت هست که توی قدم دوم ایجادش کردیم.

resizeMode : میتونید مشخص کنید که ویجت از جهت های افقی و عمودی قابلیت تغییر اندازه داشته باشه یا نه.

widgetCategory : ویجت ها این امکان رو دارند که در صفحه lock screen هم قرار بگیرند. با این گزینه میتونین تنظیم کنید که ویجت شما امکان قرار گیری در لاک اسکرین رو داره یا نه. ( keyguard = صفحه قفل یا lock screen )

previewImage : عکسی هست که توی صفحه ویجت های دستگاه اندرویدی برای انتخاب کردن ویجت به کاربر نشون داده میشه. ما اینجا برای سادگی آیکون پیشفرض برنامه رو قرار دادیم.

قدم چهارم : ایجاد کلاس اصلی ویجت

خب رسیدیم به اصل کار یعنی نوشتن کلاس اصلی ویجت 😀  کلاس ویجت باید از AppWidgetProvider ارث بری داشته باشه (اون رو extend یا گسترش بده). AppWidgetProvider دارای چند تابع اصلی هست که مهمترین اونها onUpdate ، onReceive ، onEnable ، onDisable هستند. تابعی که ما بیشتر باهاش کار داریم onUpdate هست که زمانی که اکشن های ACTION_APPWIDGET_UPDATE یا  ACTION_APPWIDGET_RESTORED فراخوانی میشن اجرا میشه. به عبارت دیگه هنگامی که ویجت باید آپدیت بشه اجرا میشه.

خب بریم واسه نوشتن کلاس. ابتدا به کلاس با اسم SimpleWidgetProvider ایجاد کنید و کد های زیر رو داخلش بنویسید :

هنگام آپدیت شدن ویجت ۳ ورودی به تابع ارسال میشن. context که برای کنترل محتوای برنامه استفاده میشه و زیاد به توضیح نیاز نداره. یه آبجکت از نوع AppWidgetManager ، که اطلاعات و تنظیماتی از ویجت رو در اختیارتون میذاره ، و یه آرایه عددی (appWidgetIds) که آی دی همه ی ویجت هایی از برنامه که نیاز به آپدیت شدن دارن رو نگه میداره. البته اگه شما بیش از ۱ دونه از ویجتتون رو فعال کنید ، (مثلا ۲ تا از ویجت برنامه رو توی صفحه اصلی قرار بدین)  تا زمانی که برنامه دوباره بارگذاری نشه، appWidgetIds فقط در برگیرنده ی آی دی آخرین ویجت هست. پس برای اینکه همه ی ویجت ها رو همزمان آپدیت کنیم ، آرایه عددی allWidgetIds رو با استفاده از تابع getAppWidgetIds آبجکت appWidgetManager ایجاد میکنیم. حالا که آی دی همه ی instance های فعال ویجتمون رو داریم ، وقتشه که کد های آپدیت شدن ویجت رو برای همشون بنویسیم. پس یه for حلال همه ی کارهاست 😀

برای آپدیت کردن محتوای ویجت ، نیاز داریم که تک تک ویو های ویجت رو داشته باشیم. این کار از طریق تعریف کردن آبجکت RemoteViews به راحتی انجام میشه. تغییر متن یک TextView یا تعریف یک اکشن برای یک دکمه هم به راحتی با توابع همین کلاس قابل انجام هستند.

برای تعریف اکشن دکمه ویجتمون (که قراره با کلیک بر روی اون ویجت دوباده آپدیت بشه) باید یک PendingIntent درست کنیم و یه Intent با اکشن ACTION_APPWIDGET_UPDATE که دارای آرایه ی آی دی ویجت های فعال هست رو بهش نسبت بدیم و در آخر PendingIntent رو به دکممون نسبت بدیم.

توی خط آخر هم به آبجکت appWidgetManager میگیم که محتوای ویجتمون رو آپدیت کن! به همین خوشمزگی 😀

قدم پنجم : ساختن receiver و اضافه کردن آن در AndroidManifest

حالا باید به اندروید بفهمونیم که ما یه ویجت داریم! این کار با ساختن یه receiver انجام میشه. فایل AndroidManifest.xml را باز کرده و کد های زیر را در تگ Application قرار بدید :

 

خب برنامه رو روی گوشی نصب و اجرا کنید. میبینید که توی لیست ویجت ها ، ویجت برنامه ما هم اومده. اون رو بکشید و توی صفحه اصلی قرار بدید. با هر بار زدن دکمه “اجرا” ، یا با گذشت ۳۰ دقیقه ، یه عدد رندوم جدید روی ویجت قرار میگیره. جالبه !

 

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

2 Replies to “چگونه یک ویجت اندرویدی ساده بنویسیم؟”

پاسخ دهید

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