رویداد ها روشی مفید برای جمعآوری دادههای مربوط به تعامل کاربر با اجزای تعاملی برنامهها در اندروید هستند. مانند فشار دادن دکمه یا لمس صفحه نمایش و غیره. چارچوب اندروید یک صف رویداد را به عنوان اولین ورود، اولین خروج (FIFO) حفظ می کند. شما می توانید این رویداد ها را در برنامه خود ثبت کنید و طبق نیاز اقدام مناسب را انجام دهید.
سه مفهوم مرتبط با مدیریت رویداد در اندروید وجود دارد:
- شنود رویداد : شنود رویداد یک interface در کلاس View است که شامل یک متد پاسخ به تماس است. این متدها توسط فریمورک اندروید زمانی فراخوانی میشوند که view که listener برروی آن ثبت شده است توسط تعامل کاربر با مورد در UI فعال شود.
- ثبت نام شنود رویداد : ثبت رویداد فرآیندی است که طی آن یک Event Listener در یک Event Handler ثبت میشود تا زمانی که آن رویداد بعد از تعامل کاربر صدا زده شود.
- Handlerهای رویداد : handlerهای رویداد مسولیت مدیریت شنودها را برعهده دارند. هنگامی که رویدادی اتفاق می افتد handler شنودهای ثبت شده را چک میکند و آخرین آیتم را فراخوانی میکند.
listenerها و handlerهای رویداد
شنود رویداد و توضیحات | handler رویداد | |
OnClickListener() زمانی که کاربر روی هر ویجتی مانند دکمه، متن، تصویر و غیره کلیک میکند یا لمس میکند یا روی آن تمرکز میکند، این handler خوانده میشود. |
onClick() | |
OnLongClickListener() این handler زمانی فراخوانی می شود که کاربر برای یک یا چند ثانیه روی هر ویجتی مانند دکمه، متن، تصویر و غیره کلیک کند یا لمس کند یا بر روی آن تمرکز کند. برای مدیریت چنین رویدادی از کنترل کننده رویداد onLongClick() استفاده خواهید کرد. |
onLongClick() | |
OnFocusChangeListener() زمانی این handler فراخوانی می شود که ویجت تمرکز خود را از دست بدهد و کاربر از آیتم view دور شود. برای مدیریت چنین رویدادی از کنترل کننده رویداد onFocusChange() استفاده خواهید کرد. |
onFocusChange() | |
OnFocusChangeListener() هنگامی که کاربر بر روی مورد متمرکز شده و یک کلید سخت افزاری را روی دستگاه فشار داده یا رها می کند، این handler فراخوانی می شود. شما از onKey() handler رویداد برای مدیریت چنین رویدادی استفاده خواهید کرد. |
onKey() | |
OnTouchListener() زمانی که کاربر صفحه یا یک کلیدی را فشار دهد، رها کند یا هر حرکتی روی صفحه نمایش انجام دهد این handler فراخوانی میشود. شما از onTouch() handler رویداد برای مدیریت چنین رویدادی استفاده خواهید کرد. |
onTouch() | |
OnMenuItemClickListener() این handler زمانی فراخوانی می شود که کاربر یک آیتم منو را انتخاب کند. برای مدیریت چنین رویدادی از کنترل کننده رویداد onMenuItemClick() استفاده خواهید کرد. |
onMenuItemClick() | |
onCreateContextMenuItemListener() هنگامی که منوی زمینه در حال ساخت است (به عنوان نتیجه یک “کلیک طولانی” پایدار) این handler فراخوانی میشود. |
onCreateContextMenu() |
listenerرویدادهای بیشتری به عنوان بخشی از کلاس View مانند OnHoverListener، OnDragListener و غیره موجود است که ممکن است برای برنامه شما مورد نیاز باشد.
ثبت نام شنود رویداد
ثبت رویداد فرآیندی است که طی آن یک Event Listener در یک Event Handler ثبت میشود تا زمانی که آن رویداد بعد از تعامل کاربر صدا زده شود.
- استفاده از یک کلاس داخلی ناشناس
- کلاس Activity رابط Listener را پیاده سازی می کند.
- استفاده از فایل گرافیکی activity_main.xml برای تعیین مستقیم رویداد handler.
بخش زیر نمونه های دقیقی را در مورد هر سه سناریو به شما ارائه می دهد.
حالت لمس کردن
کاربران میتوانند با استفاده از کلیدها یا دکمههای سختافزاری یا لمس صفحه با دستگاههای خود تعامل داشته باشند. لمس صفحه، دستگاه را در حالت لمسی قرار میدهد. سپس کاربر می تواند با لمس دکمه های مجازی روی صفحه، تصاویر و غیره با آن تعامل داشته باشد. می توانید با فراخوانی متد isInTouchMode() کلاس View بررسی کنید که آیا دستگاه در حالت لمسی است یا خیر.
تمرکز
یک view یا ویجت معمولاً هایلایت می شود یا هنگامی که در حالت فوکوس است، مکان نما چشمک زن را نمایش می دهد. این نشان می دهد که آماده پذیرش ورودی از کاربر است.
- isFocusable() – این متد یک مقدار boolean برمیگرداند.
- isFocusableInTouchMode() – بررسی می کند که آیا view در حالت لمسی قابل فوکوس است یا خیر. (ممکن است در هنگام استفاده از کلید سخت افزاری، یک نما قابل فوکوس باشد، اما زمانی که دستگاه در حالت لمسی است، قابل فوکوس نباشد)
android:foucsUp="@=id/button_l"
onTouchEvent()
public boolean onTouchEvent(motionEvent event){ switch(event.getAction()){ case TOUCH_DOWN: Toast.makeText(this,"شما انگشت خود را روی دکمه گذاشتید",Toast.LENTH_LONG).show(); break(); case TOUCH_UP: Toast.makeText(this,"شما انگشت خود را از روی دکمه برداشتید",Toast.LENTH_LONG).show(); break; case TOUCH_MOVE: Toast.makeText(this,"شما انگشت خود را بر روی دکمه حرکت دادید"Toast.LENTH_LONG).show(); break; } return super.onTouchEvent(event) ; }
مثال مدیریت رویداد ها در اندروید
ثبت نام listener رویداد با استفاده از یک کلاس داخلی ناشناس.
کاربران میتوانند با استفاده از کلیدها یا دکمههای سختافزاری یا لمس صفحه با دستگاههای خود تعامل داشته باشند. لمس صفحه، دستگاه را در حالت لمسی قرار میدهد. سپس کاربر می تواند با لمس دکمه های مجازی روی صفحه، تصاویر و غیره با آن تعامل داشته باشد. می توانید با فراخوانی متد isInTouchMode() کلاس View بررسی کنید که آیا دستگاه در حالت لمسی است یا خیر.
اما اگر handler را روی بیش از یک کنترل اعمال کنید، باید کد مربوط به کنترل کننده را برش داده و جایگذاری کنید و اگر کد مربوط به هندلر طولانی باشد، حفظ کد را سخت تر می کند.
در زیر مراحل ساده ای وجود دارد که نشان می دهد چگونه از کلاس Listener جداگانه برای ثبت و ضبط رویداد کلیک استفاده می کنیم. به روشی مشابه می توانید listener خود را برای هر نوع رویداد مورد نیاز دیگری پیاده سازی کنید.
توضیحات | مرحله |
ابتدا یک پروژه جدید در اندروید استودیو با یک پکیج دلخواه ایجاد کنید و ادامه مراحل را دنبال کنید. | 1 |
کدهای درون فایل MainActivity.class را مطابق کدهای که در پایین آورده ایم تغییر بدهید. | 2 |
کدهای درون فایل activity_main.xml را مطابق کدهای که در پایین آورده ایم تغییر بدهید. | 3 |
برنامه را بر روی یک تلفن واقعی یا شبیه ساز اجرا کنید و تست را انجام بدهید. | 4 |
کدهای فایل MainActivity.java
package com.seven.cloner.articleslib; import androidx.appcompat.app.AppCompatActivity; import android.app.ProgressDialog; import android.os.Bundle; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private ProgressDialog progress; private Button b1, b2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progress = new ProgressDialog(this); b1 = findViewById(R.id.button); b2 = findViewById(R.id.button2); b1.setOnClickListener(v -> { TextView txtView = findViewById(R.id.textView); txtView.setTextSize(25); }); b2.setOnClickListener(v -> { TextView txtView = findViewById(R.id.textView); txtView.setTextSize(55); }); } }
فایل layout_main.xml
<?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:padding="32dp" tools:context=".MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="مدیریت رویداد ها" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" android:text="7Cloner.com" android:textColor="#009688" android:textSize="30dp" /> <ImageButton android:id="@+id/imageButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/textView2" android:src="@drawable/abc" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:minWidth="120dp" android:layout_below="@+id/imageButton" android:layout_centerHorizontal="true" android:text="متن کوچک" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:minWidth="120dp" android:layout_below="@+id/button" android:layout_alignEnd="@+id/button" android:layout_alignRight="@+id/button" android:text="متن بزرگ" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/button2" android:layout_centerHorizontal="true" android:layout_marginTop="16dp" android:text="7CLONER.COM" android:textColor="#4CAF50" android:textSize="25dp" /> </RelativeLayout>
حالا سعی کنید یکی یکی روی دو دکمه کلیک کنید و میبینید که فونت متن 7CLONER.COM تغییر میکند. این اتفاق میافتد چون متد کنترل رویداد کلیک برای کیک بر روی دکمه ثبتشده است.