کنترل رویدادها در اندروید
کنترل رویدادها در اندروید یک راه مفید برای جمع آوری داده ها از تعاملات کاربر با اجزای مختلف برنامه ها است. مانند زمانی که کاربر صفحه را لمس یا روی یک دکمه کلیک می کند. اندروید رویداد های اتفاق افتاده را در یک صف، که دارای ساختار اولین ورودی اولین خروجی(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() مدیریت می شود. |
onCreateContextMenu() | زمانی که کاربر منو زمینه ساخته شده را انتخاب کند فراخوانی می شود.(با یک کلیک طولانی) |
کلاس view شنونده های خیلی بیشتری نسبت به آنچه در جدول بالا آورده شده است را ارائه می دهد. بنابراین چنانچه قصد ساختن یک نرم افزار پیچده را دارید، توصیه می کنم برای دیدن لیست کامل شنونده های رویدادها به سایت رسمی اندروید مراجعه کنید.
مطلب پیشنهادی: آموزش برنامه نویسی اندروید- سرویس ها در اندروید
ثبت شنونده ی رویداد
ثبت شنونده ی رویداد فرآیندی است که طی آن یک متد برای کنترل رویدادها در اندروید تعریف می شود؛ به این معنا که هر گاه رویداد مورد نظر توسط شنونده شناسایی شود این متد فراخوانی می گردد. اگرچه به روش های مختلفی می توان برای یک رویداد شنونده تعریف کرد، با این وجود در زیر ۳ روش را که از بقیه بهتر هستند آورده ایم و شما بسته به نیازتان می توانید از هر روشی که مناسب تر بود استفاده کنید.
- استفاده از توابع داخلی کلاس.
- ثبت شنونده با استفاده از تعریف واسط شنونده در داخل کلاس اکتیویتی.
- با استفاده مستقیم از فایل Layout file activity_main.xml .
در بخش زیر سه روش به همراه مثال توضیح داده شده.
حالت لمس صفحه
کاربر با استفاده از کلید های سخت افزاری دستگاه یا لمس صفحه ی نمایش می تواند با دستگاه ارتباط برقرار کند. لمس کردن صفحه ی نمایش باعث می شود حالت لمس صفحه فعال شود و کاربر بتواند از طریق لمس کردن کنترل ها (مثل دکمه ها) با برنامه ها تعامل داشته باشد. با این حال می توانیم وضعیت فعال بودن لمس صفحه را با فراخوانی متد ()isInTouchMode از کلاس View بررسی کنیم.
فوکوس
معمولا هنگامی که یک ویو یا ویجت فوکوس را در اختیار می گیرد، یک مکان نمای چشمک زن و یا حاشیه ای درخشان در آن ایجاد می شود که نشان می دهد کامپوننت آماده ی دریافت ورودی از کاربر است.
- ()isfocusable : مقدار true یا false را بر می گرداند.
- ()isFocusableInTouchMode : بررسی می کند که آیا ویو در حالت لمس قابلیت فوکوس پذیری دارد یا نه. (ممکن است برخی از ویوها تنها هنگام استفاده از کلید های سخت افزاری قابلیت فوکوس پذیری داشته باشند)
android:foucsUp="@=id/button_l"
()onTouchEvent
public boolean onTouchEvent(motionEvent event){ switch(event.getAction()){ case TOUCH_DOWN: Toast.makeText(this,"you have clicked down Touch button",Toast.LENTH_LONG).show(); break(); case TOUCH_UP: Toast.makeText(this,"you have clicked up touch button",Toast.LENTH_LONG).show(); break; case TOUCH_MOVE: Toast.makeText(this,"you have clicked move touch button"Toast.LENTH_LONG).show(); break; } return super.onTouchEvent(event) ;
مثال های کنترل رویدادها در اندروید
ثبت شنونده ی رویداد با استفاده از توابع داخلی کلاس
در این روش از متد های کلاس listener برای پیاده سازی شنونده استفاده می شود. استفاده از این روش زمانی مفید است که در هر کلاس اکتیویتی یک کنترل کننده پیاده سازی شود و همچنین بخواهیم آرگومان هایی را به گرداننده ی رویداد ارسال کنیم. زیرا در این روش می توانیم بدون فراخوانی کردن ارجاع دهنده های اکتیویتی به متغییر های اختصاصی (private) تعریف شده در اکتیویتی دسترسی داشته باشیم.
اما اگر بخواهیم در یک کلاس برای بیش از یک کنترل گرداننده ی رویداد تعریف کنیم، باید مجموعه ای از کدها ی تکراری را برای هر گرداننده بنویسیم و چنانچه حجم کدها برای گرداننده ها زیاد باشد، حفظ و رسیدگی به آن ها تبدیل به یک کار مشکل خواهد شد.
این مثال در چند مرحله ی ساده نشان می دهد که چگونه یک متد گرداننده را برای رویداد کلیک، با استفاده از توابع داخلی ثبت کنیم.
مرحله | توضیحات |
۱ | با استفاده از Android Studio IDE یک برنامه اندروید ایجاد کنید و به عنوانMy Application تحت بسته com.example.myapplication نامگذاری کنید. نحوه ی ایجاد پروژه ی جدید در بخش آموزشی مثال !Hello World توضیح داده شده است. |
۲ | فایل src/MainActivity.java را برای افزودن دو دکمه listeners و handleers تغییر دهید. |
۳ | محتوای پیشفرض res/layout/activity_main.xml را تغییر دهید تا کنترلهای رابط کاربری را شامل شود. |
۴ | نیاز به تغییر ثابت های رشته پیش فرض نیست. |
۵ | نرم افزار را با شبیه ساز اندروید اجرا کنید و نتیجه را مورد بررسی قرار دهید. |
در زیر محتوای تغییر یافته ی فایل src/com.example.My Application/MainActivity.java قرار دارد.
package com.example.myapplication; import android.app.ProgressDialog; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends ActionBarActivity { private ProgressDialog progress; Button b1,b2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progress = new ProgressDialog(this); b1=(Button)findViewById(R.id.button); b2=(Button)findViewById(R.id.button2); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TextView txtView = (TextView) findViewById(R.id.textView); txtView.setTextSize(25); } }); b2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TextView txtView = (TextView) findViewById(R.id.textView); txtView.setTextSize(55); } }); } }
و در ادامه مطلب محتوا res/layout/activity_main.xml file قرار دارد.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Event Handling " android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp"/> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_above="@+id/imageButton" android:layout_centerHorizontal="true" android:layout_marginBottom="40dp" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Small font" android:id="@+id/button" android:layout_below="@+id/imageButton" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Font" android:id="@+id/button2" android:layout_below="@+id/button" android:layout_alignRight="@+id/button" android:layout_alignEnd="@+id/button" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/textView" android:layout_below="@+id/button2" android:layout_centerHorizontal="true" android:textSize="25dp" /> </RelativeLayout>
و در ادامه محتویات res/values/stringings.xml برای تعریف دو ثابت جدید آورده شده است:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">myapplication</string> </resources>
و در ادامه محتویات پیش فرض AndroidManifest.xml آورده شده است:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.myapplication.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
الان برنامه My Application را اجرا کنید. فرض میکنم AVD را در حین انجام تنظیمات محیط ایجاد کرده اید. برای اجرای برنامه از Android Studio، یکی از فایل های اکتیویتی پروژه خود را باز کنید و روی آیکون اجرا در نوار ابزار کلیک کنید. Android Studio این برنامه را در AVD خود نصب می کند و آن را اجرا می کند و اگر همه چیز تنظیم باشد و برنامه شما مشکلی نداشته باشد، پنجره Emulator همانند تصویر زیر است.
حال اگر روی دکمه ها کلیک کنید می بینید که اندازه ی فونت Hello World تغییر می کند. علت این تغییر این است که هنگام رخ دادن هر رویداد کلیک، تابعی که برای کنترل رویداد کلیک شدن هر دکمه ثبت شده است فراخوانی می گردد.
منبع: tutorialspoint
من رشتم کامپوتر نیست از کجا شروع کنم