کنترل رویداد ها در اندروید

Touch Event

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

 

در زیر سه مفهوم در رابطه با مدیریت رویدادهای اندروید آورده شده است.

Event Listeners (شنونده ی رویداد) : شنونده ی رویداد یا گیرنده ی تلنگر یک رابط در کلاس view است که در پاسخ به وقوع یک رویداد، یک متد را فراخوانی می کند. به عبارت دیگر یک متد شنونده ی رویداد زمانی فراخوانی می شود که کاربر رویدادی از آیتم (مثل کلیک کردن) که برایش شنونده ی رویداد تعریف شده است را باعث شود.

Event Listeners Registration (ثبت شنونده ی رویداد) : ثبت شنونده ی رویداد فرآیندی است که طی آن یک متد برای اداره ی رویداد تعریف می شود؛ به این معنا که هر گاه شنونده، رویداد مورد نظر را شناسایی کرد این متد را فراخوانی می کند.

Event Handlers (گرداننده ی رویداد) : وقتی یک رویداد که برایش شنونده تعریف شده است اتفاق می افتد شنونده ی رویداد، گرداننده ی رویداد را که یک متد برای مدیریت رویداد می باشد را فراخوانی می کند.

گرداننده ی رویداد ها و شنونده ی آن ها

گرداننده ی رویداد شنونده ی رویداد و توضیحات
onClick() OnClickListener()این متد زمانی فراخوانی می شود که کاربر روی یک ویجت مانند دکمه، برچسب متنی، عکس و مانند این ها کلیک کند و یا آن را لمس نماید. این رویداد با گرداننده ی رویداد onClick() مدیریت می شود.
onLongClick() OnLongClickListener()این متد زمانی فراخوانی می شود که کاربر برای یک ثانیه یا بیشتر یک ویجت مانند دکمه، برچسب متنی، عکس و مانند این ها را لمس نماید. این رویداد با گرداننده ی رویداد onLongClick() مدیریت می شود.
onFocusChange() OnFocusChangeListener()این متد زمانی فراخوانی می شود که ویجت فوکوس را از دست بدهد و کاربر آن را ترک کند. این رویداد با گرداننده ی رویداد onFocusChange() مدیریت می شود.
onKey() OnKeyListener()این متد زمانی فراخوانی می شود که کاربر یک کلید سخت افزاری از دستگاه را فشار دهد یا رها کند. این رویداد با گرداننده ی رویداد onKey() مدیریت می شود.
onTouch() OnTouchListener()این متد هنگامی که کاربر روی دکمه ای کلیک کند یا صفحه را لمس کند فراخوانی می شود. این رویداد با گرداننده ی رویداد onTouch() مدیریت می شود.
onMenuItemClick() OnMenuItemClickListener()این متد زمانی که کاربر یک آیتم را از منو انتخاب کند فراخوانی می شود. این رویداد با گرداننده ی رویداد onMenuItemClick() مدیریت می شود.

کلاس view شنونده های خیلی بیشتری نسبت به آنچه در جدول بالا آورده شده است را ارائه می دهد. بنابراین چنانچه قصد ساختن یک نرم افزار پیچده را دارید، توصیه می کنم برای دیدن لیست کامل شنونده های رویدادها به سایت رسمی اندروید مراجعه کنید.

ثبت شنونده ی رویداد

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

استفاده از توابع داخلی کلاس.

ثبت شنونده با استفاده از تعریف واسط شنونده در داخل کلاس اکتیویتی.

تعیین کردن گرداننده ی رویداد در داخل فایل (XML (layout file.

 

در ادامه جزئیات این سه روش را به همراه مثال توضیح خواهیم داد.

حالت لمس صفحه

کاربر با استفاده از کلید های سخت افزاری دستگاه یا لمس صفحه ی نمایش می تواند با دستگاه تعامل برقرار کند. لمس کردن صفحه ی نمایش باعث می شود حالت لمس صفحه فعال شود و کاربر بتواند از طریق لمس کردن کنترل ها (مثل دکمه ها) با برنامه ها تعامل داشته باشد. با این حال می توانیم وضعیت فعال بودن لمس صفحه را با فراخوانی متد ()isInTouchMode از کلاس View بررسی کنیم.

Touch Event

فوکوس

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

()isFocusable : این متد بررسی می کند که آیا کامپوننت قابلیت پذیرفتن فوکوس را دارد یا نه و مقدار “true” یا “false” را بر می گرداند.

()isFocusableInTouchMode : بررسی می کند که آیا ویو در حالت لمس قابلیت فوکوس پذیری دارد یا نه. ممکن است برخی از ویوها تنها هنگام استفاده از کلید های سخت افزاری قابلیت فوکوس پذیری داشته باشند.

مثال

در ادامه برای مثال گرداننده ی رویداد ()onClick را به سه روشی که قبل تر گفته شد برای دو دکمه ثبت کرده ایم.

روش اول – ثبت شنونده ی رویداد با استفاده از توابع داخلی کلاس

در این روش از متد های کلاس listener برای پیاده سازی شنونده استفاده می شود. استفاده از این روش زمانی مفید است که در هر کلاس اکتیویتی یک کنترل کننده پیاده سازی شود و همچنین بخواهیم آرگومان هایی را به گرداننده ی رویداد ارسال کنیم. زیرا در این روش می توانیم بدون فراخوانی کردن ارجاع دهنده های اکتیویتی به متغییر های اختصاصی (private) تعریف شده در اکتیویتی دسترسی داشته باشیم.

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

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

مرحله توضیحات
۱ با استفاده از اندروید استودیو یک پروژه ی جدید با نام EventDemo تحت بسته ی com.example.eventdemo ایجاد کنید.
۲ ثابت های رشته ای مورد نیاز را مانند آنچه در ادامه آمده است در فایل res/values/strings.xml تعریف کنید.
۳ محتوای فایل res/layout/activity_main.xml را به منظور ایجاد کنترل های رابط کاربری، مانند آنچه در ادامه آمده است تغییر دهید.
۴ محتوای فایل java/com.example.eventdemo/MainActivity.java را نیز مانند آنچه در ادامه آمده است تغییر دهید.
۵ برنامه را با استفاده از شبیه ساز اندروید اجرا کنید و نتیجه را مورد بررسی قرار دهید.

در زیر محتوای فایل res/values/strings.xml آورده شده است.

کدهای زیر نیز مربوط به محتوای تغییر یافته ی فایل res/layout/activity_main.xml می باشد.

و در نهایت کدهای زیر مربوط به محتوای تغییر یافته ی فایل اکتیویتی اصلی java/com.example.eventdemo/MainActivity.java می باشند.

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

Event Listeners

حال اگر روی دکمه ها کلیک کنید می بینید که اندازه ی فونت “oration.ir” تغییر می کند. علت این تغییر این است که هنگام رخ دادن هر رویداد کلیک، تابعی که برای کنترل رویداد کلیک شدن هر دکمه ثبت شده است فراخوانی می گردد.

روش دوم – ثبت شنونده با استفاده از تعریف واسط

در این روش کلاس Activity، واسط شنود کننده ی شما را فراخوانی می کند و شما باید متد اداره کننده را در Activity اصلی قرار دهید و سپس (setOnClickListener(this را فراخوانی کنید.

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

این مثال در چند مرحله ی ساده نحوه ی ثبت شنونده با استفاده از تعریف واسط شنونده در داخل کلاس اکتیویتی را نشان می دهد. برای این منظور مراحل جدول زیر را دنبال کنید.

مرحله توضیحات
۱ محتوای فایل java/com.example.eventdemo/MainActivity.java را مانند آنچه در ادامه آمده است تغییر دهید.
۲ برنامه را با استفاده از شبیه ساز اندروید اجرا کنید و نتیجه را مورد بررسی قرار دهید.

در زیر محتوای تغییر یافته ی فایل java/com.example.eventdemo/MainActivity.java آورده شده است

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

روش سوم – تعیین کردن گرداننده ی رویداد در داخل فایل (XML (layout file

این مثال نحوه ی ساختن گرداننده ی رویداد در داخل فایل (XML (layout file را به شما نشان می دهد. در اینجا برای ثبت متد گرداننده ی رویداد کلیک، باید نام متد را برای ویژگی android:onClick تعیین کنیم. متد گرداننده ی رویداد باید دارای مقدار بازگشتی از نوع void باشد و یک ویو را به عنوان آرگومان دریافت کند. با این وجود انتخاب نام برای این متد اختیاری است و لازم نیست کلاس اصلی، واسط خاصی را پیاده سازی کند. برای انجام این مثال مراحل جدول زیر را دنبال کنید.

مرحله توضیحات
۱ محتوای فایل res/layout/activity_main.xml را مانند آنچه در ادامه آمده است تغییر دهید.
۲ محتوای فایل java/com.example.eventdemo/MainActivity.java را مانند آنچه در ادامه آمده است تغییر دهید.
۳ برنامه را با استفاده از شبیه ساز اندروید اجرا کنید و نتیجه را مورد بررسی قرار دهید.

در زیر محتوای فایل res/layout/activity_main.xml آورده شده است.

محتوای زیر نیز مربوط به فایل java/com.example.eventdemo/MainActivity.java می باشد.

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

 

 

پاسخ دهید

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