جلسه سوم برنامه نویسی موبایل

در J2ME

جلسه سوم:

خب تو دو تا جلسه قبل که عملاً کاری نکردیم :دی (کلاً جدیداً وقتی دارم یه چی می نویسم وسطاش خوابم میاد :دی اینه که جلسات کوتاه برگزار میشن:دی) ببینیم این جلسه می تونیم یه کم بیشتر کار کنیم یا نه؟

بریم رو ادامه بحثمون در باره API های سطح بالا!

List:

List که دیگه از اسمش پیداست برای چی ساخته شده :دی ، لیست ها برای این استفاده می شن که یه سری اقلام و موارد رو به کاربر نشون بدیم و کاربر بسته به نوعه لیست بتونه یک یا چند مورد از گزینه های لیست رو انتخاب کنه ، گاهی هم از لیست فقط به عنوان نمایش دهنده یه سری اسامی استفاده می کنیم. در کل کاربردش به خود شما ربط پیدا می کنه!!

List زیر کلاسه Screen هست (یا است یا هستش) و تمامه صفحه رو می پوشونه.یعنی وقتی تو یه صفحه از List استفاده می کنیم فقط می تونیم از List استفاده کنیم و بس.(حالا خیلی غصه نخورید بعداً یه کاریش می کنیم :دی)

برای ایجاد List یکی از این دو تا سازنده ها رو می تونیم استفاده کنیم:
 

با سازنده اولی فقط عنوان لیست  و نوعش رو مشخص می کنیم .بعداً با استفاده از متد هایی که جلوتر توضیح میدم اعضاش رو بهش اضافه می کنیم.

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

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

خب ، اما نوع لیست:

دیدیم که تو پارامتر های سازنده لیست باید نوع لیست رو مشخص می کردیم (همون listType):

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

1) EXCLUSIVE:

تو این حالت لیست به صورت مجموعه ای از چند RadioButton در میاد و کاربر فقط می تونه یکی از اعضای لیست رو انتخاب کنه.

 

2) IMPLICIT:

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

3) MULTIPLE:

اینم که دیگه از اسمش معلومه ، تو این حالت کاربر می تونه چند مورد از گزینه های لیست رو انتخاب کنه.یعنی تو این حالت گزینه ها به صورت CheckBox هستن.

 

تو قالبه مثال این سه مورد رو توضیح می دم کم کم همه چی میاد دستمون :

(فعلاً از سازنده دومیه استفاده می کنیم.عکس هم نمی زاریم :دی)

مثال یک :لیست به صورت EXCLUSIVE:

 

به پارامتر های سازنده لیست توجه کنید، اولیش که عنوانه هیچ! ، دومی نوعه لیست بود که گذاشتم List.EXCLUSIVE ، سومی یه آرایه از اسامی هست که به عنوان اسامی آیتم های لیست به کار میره ، چهارمی هم عکس بود که فعلاً سانسور شد (null گذاشتم).

اینم خروجیش:

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

(جوونه من حتماً برنامه ها رو زارت و زورت بفرستید رو گوشیتون اونجا هم خروجی رو ببینید، حالا از ما گفتن!)

 

مثال دوم : لیست به صورت IMPLICIT:

اینم خروجیش:

و اما مثال سوم : لیست به صورت MULTIPLE:

و اینم خروجیش : (یه کم سر و کله بزنید با خروجی ها تا قشنگ دستتون بیاد تفاوت ها)

خب تا اینجا یه نموره در مورده تفاوت لیست های EXCLUSIVE و IMPLICIT صحبت کردیم ، تفاوت ظاهریشون رو هم دیدیم.ولی یه تفاوت عمده دیگه هم دارن.

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

تو مثاله زیر یه لیست از نوع IMPLICIT به وجود میاریم ، سپس یه مقداری کد برای مدیریت رویداد بهش اضافه می کنیم ، سر آخر برنامه رو اجرا می کنیم و گزینه های لیست کلیک می کنیم تا ببینیم اوضاع از چه قراره؟ :دی

نکاته مهم کد رو دورش خط کشیدم.

اولین نکته مهم نوع لیست هست که از نوعه IMPLICIT گذاشتم.

دومین نکته مهم اینه که برای مدیریت رویداد های لیست بهش یه CommandListener اضافه کردم .(با فراخوانی setCommandListener و ...). تو قسمته commandAction نوشتم که هر گاه رویدادی اتفاق افتاد یه Alert ایجاد بشه و نمایش داده بشه.

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

کلاً یه دونه متد برای نمایش کامپوننت ها ، مثله همین setCurrent که من نوشتم همون اول بنویسید خیلی کار راه اندازه ....:دی

خب حالا برنامه رو اجرا کنید ، یه کم تو لیست بالا پایین برید (با دکمه های بالا پایین مثلاً ) و بعد هم یکی از گزینه ها رو انتخاب کنید (با دکمه وسطی مثلاً) اونوقت باید Alert مورده نظر نشون داده شه.

خب حالا کده بالا رو تغییر بدید و نوعه لیست رو به EXCLUSIVE تغییر بدید (دیگه خودمون رو بکشیم نمی تونیم اون Alert رو نمایش بدیم:دی)

خب

خب پس تا اینجا فهمیدیم که اگه لیست از نوع IMPLICIT باشه انتخاب هر گزینه از لیست یه رویداد ایجاد می کنه و میشه به سادگی مدیریتش کرد ، ولی اگه مثله کده قبلیه لیستمون از نوع EXCLUSIVE باشه یا از نوع MULTIPLE باشه چی کار کنیم؟ (چه خاکی تو سرمون بریزیم؟؟؟؟ :دی)

خب اینم راه داره :دی ، تو این حالت خودمون باید به لیست Command اضافه کنیم.

بله! Command :دی

تو همین برنامه قبلیه که کار نمی کرد و Alert رو نشون نمی داد یه Command اضافه می کنم حالش رو ببرید ها! 

نحوه ایجاد Command رو دقت کنید که جلو تر ها خیلی ازش استفاده می کنیم.

اولین پارامتر وروی سازنده Command عنوانش هست. دومین پارامتر نوعش هست و سومی هم اولویتش. (شاید بعداً بیشتر توضیح دادم اینارو :دی)

توجه کنید که با استفاده از addCommand می تونیم به لیست Command اضافه کنیم.

خب حالا برنامه رو اجرا کنید باید به صورت زیر باشه :

یکی از گزینه ها (مثلاً hasan) رو انتخاب کنید و بعد هم GO  رو انتخاب کنید!باید اون Alert خوبه رو ببینید :)

نکته: اینکه Command ها چی جوری نمایش داده بشن شدیداً به مدل گوشیتون بستگی داره ، پس حتماً برنامه رو تو یه گوشی اجرا کنید.

اجازه بدید یه کم بیشتر با Command ها کار کنیم.

گفتم که اولین پارامتر عنوانش هست ، این که هیچ.

دومین پارامتر گفتم نوعش رو مشخص می کنه که می تونه یکی از موارد زیر باشه :

Command.BACK

Command.CANCEL

Command.EXIT

Command.HELP

Command.ITEM

Command.OK

Command.SCREEN

Command.STOP

 

بیایید با این حرفا یه Command دیگه به برنامه اضافه کنیم با عنوان D مثلاً :) (یا به قولی :"مثلاً فرضاً " :-O    )

حالا برنامه رو اجرا کنید باید خروجی مثله زیر باشه :

باز هم می گم تو گوشیتون ممکنه فرق کنه اونم از زمین تا آسمون

می بینید که دو تا Command داریم این دفعه و جالب اینجاست که فرقی نداره کدوم یکی از این دو تا Command ها رو انتخاب می کنیم ، هر کدوم رو که انتخاب کنیم همون Alert خوبه نشون داده می شه.ولی انصافاً اینجوری حال نمی ده ، پس بیایید یه کاری کنیم که فقط اگه Command ای که عنوانش GO هست عملیاتی باشه (یعنی Alert رو نشون بده).

پس کد رو به صورت زیر تغییر می دیم:

به اون if  که دورش کادر کشیدم حتماً توجه کنید ، اینجا داریم نحوه کار با اولین پارامتر commandAction رو هم یاد می گیریم. :)

حالا برنامه رو اجرا کنید و چند بار این Command ای که عنوانش D هست رو انتخاب کنید و خلاصه خودتون رو باهاش سر گرم کنید :) ، متوجه می شید که اتفاقی نمی افته ولی اگه رو GO کلیک کنید اونوقت مجدداً اون Alert خوبه نمایش داده میشه.

خب ما که تا اینجا اومدیم پس بگیریم رو پارامتر دوم commandAction هم کار کنیم.

این پارامتر همون Displayable ای هست که Command ها بهش اضافه شده بودن و هر رویدادی به اون بر می گرده ، چون تو این مثال Command ها رو به myList اضافه کرده بودیم پس این Displayable  باید به همون myList اشاره کنه. اجازه بدید مثال قبلی رو طوری تغییر بدیم که گزینه انتخابی توی لیست به عنوان Alert نمایش داده شه (به جای HELLO).

به کده زیر توجه کنید : فقط  به داخل commandAction توجه کنید ،چون فقط همین یه قسمت رو تغییر می دم و بقیه کد مثله قبل هستش!!!:

اولین کاری که کردم این بود که پارامتر d رو به لیست تبدیل کردم (cast کردم )

getSelectedIndex متدیه که اندیس عنصر انتخابی از لیست رو بر می گردونه .

getString هم متدیه که یه اندیس می گیره و  عنوان آیتم متناظر با اون رو بر می گردونه.

یعنی رشته name  عنوان گزینه انتخاب شده از لیست رو تو خودش نگه می داره.

Alert رو هم با استفاده از این رشته (یعنی name ) ایجاد کردم.

حالا برنامه رو اجرا کنید و یکی از گزینه ها مثلاً hasan رو انتخاب کنید و GO رو انتخاب کنید:

پس از اینکه یه گزینه رو انتخاب کردین و دکه GO رو هم فشار دادین باید یه Alert متناسب با گزینه انتخاب شده نشون داده بشه:

 

نزدیک بود یادم بره یه چیزی :) ، تا یادم نرفت این رو هم بگم.خالی از لطف نیست.

سومین پارامتر Command گفتیم که مربوط هست به اولویت.خب که چی؟

جواب : وقتی تعداد Command ها زیاد بشه اونوقت به صورت یه منو در میان و اینکه داخل منو چه جوری چیده شن به اولویت اونا بستگی داره.

بیایید کلاً کد رو عوض کنیم (به صورت زیر) :

می بینید که 5 تا Command ایجاد کردم ، همشون هم از نوع Command.OK و به هر کدوم یه اولویتی دادم. حالا ببینیم چی میشه وقتی برنامه اجرا میشه (این مورد دیگه شدیده شدیده شدید به گوشیتون بستگی داره و حتماً باید رو خوده موبایل اجرا شه )

اینم خروجی:

می بینید که GO با اولویت 1 رفته اون گوشه و بقیه همه به رفتن داخل Menu .حالا اگه منو رو انتخاب کنید به صورت زیر خواهد بود :

می بینید که Command ها داخل این منو بر اساس اون اولویتی که ما تو کد مشخص کردیم چیده شدن ،اول D با اولویت 2 بعد F با اولویت 3 بعد G با اولویت 4 و سر آخر هم E با اولویت 5!

 

یه سری متد دیگه از لیست اسم ببرم و پرونده این جلسه رو ببندیم !

public   int  append (String  txt,   Image  img)d

یه آیتم جدید به انتهای لیست اضافه می کنه و اندیس اون رو بر می گردونه.پارامتر اول متن این آیتم و پارامتر دوم تصویر این آیتم هست.

نکته: جلو تر ها سعی می کنیم یه برنامه کامل با این حرفایی که می زنیم بنویسیم پس فعلاً خیلی نگران اینکه چرا با Image  و .... کار نمی کنیم نباشید.

public    void   delete (int index)d

یه آیتم از لیست که اندیس اون با پارامتر  index مشخص میشه رو حذف می کنه.

public   void  deleteAll()d

همه عناصر لیست رو حذف می کنه.

public    Font   getFont(int  index)d

فونت یه آیتم از لیست رو که اندیس اون با index مشخص میشه بر می گردونه.

public   Image   getImage(int   index)d

تصویر مربوط به آیتم از لیست رو بر می گردونه.

public   int   getSelectedIndex()d

اندیس عنصری از لیست رو که انتخاب شده بر می گردونه. (یه بار با این متد کار کردیم دیگه!)

public   String   getString(int   index)d

متن یه آیتم رو که اندیس اون با index مشخص میشه بر می گردونه!

public    void  insert(int  index,String  txt,Image  img)d

یه آیتم جدید تو اندیس مشخص شده درج می کنه.

public   boolean  isSelected(int  index)d

چک می کنه که آیا آیتم متناظر با اندیسه index انتخاب شده هست یا نه؟؟؟

public   void  set(int  index,String   txt,Image   img)d

آیتم موجود در اندیسه index رو با مقادیر جدیده txt و img تغییر می ده.

public   void  setSelectedIndex(int   index,boolean    selected)d

آیتم موجود در اندیس index رو در حالت انتخاب یا عدم انتخاب قرار می ده . (بسته به مقدار selected ، اگه selected برابر با true باشه آیتم مورد نظر در حالت انتخاب قرار می گیره و اگه selected برابر با false باشه آیتم مورد نظر در حالت عدم انتخاب قرار می گیره)

public    int  size()d

تعداد اعضای لیست رو بر می گردونه.

و اما یه نکته دیگه : به لیست هم میشه Ticker اضافه کرد:

public  void  setTicker(Ticker   ticker)d

فعلاً برای این جلسه بسه دیگه :) ، می خواستم یه کده دیگه هم بزنم ولی حسش نیست :) همینقدر فعلاً کافیه :) :) :)