سبد (0)

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

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

تعاملات کاربر با رابط کاربری در دو سطح صورت می گیرد:سطح اکتیویتی و سطح View. در سطح اکتیویتی کلاس Activity متدهای مورد نیاز را در اختیار شما قرار می دهد.بعضی از این متدها که می توانید در اکتیویتی خود از آنها بهره ببرید در قسمت زیر آورده شده است:

  • onKeyDown -- وقتی کلیدی فشرده می شود که توسط هیچ View یی از اکتیویتی تحت کنترل قرار نگرفته است.
  • onKeyUp -- وقتی کلیدی رها می شود که توسط هیچ view یی از اکتیویتی تحت کنترل قرار نگرفته است.
  • onMenuItemSelected -- وقتی که گزینه ای از منو توسط کاربر انتخاب می شود.
  • onMenuOpened -- وقتی که پنل منو توسط کاربر باز می شود.

Override کردن متدهای موجود در اکتیویتی

برای اینکه ببینیم اکتیویتی ها چگونه با کاربر تعامل دارند,تمرین زیر را که چند متد از کلاس پایه اکتیویتی را پیاده سازی کرده,انجام دهید.

1.یک پروژه ی جدید با نام UIActivity ایجاد کنید.

2.تغییرات زیر را در فایل main.xml ایجاد کنید:

 

<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:orientation=”vertical”
xmlns:android=”http://schemas.android.com/apk/res/android”
>
<TextView
android:layout_width=”214dp”
android:layout_height=”wrap_content”
android:text=”Your Name”
/>
<EditText
android:id=”@+id/txt1”
android:layout_width=”214dp”
android:layout_height=”wrap_content”
/>
<Button
android:id=”@+id/btn1”
android:layout_width=”106dp”
android:layout_height=”wrap_content”
android:text=”OK”
/>
<Button
android:id=”@+id/btn2”
android:layout_width=”106dp”
android:layout_height=”wrap_content”
android:text=”Cancel”
/>
</LinearLayout>

3.فایل MainActivity.java را به صورت زیر تغییر دهید:

 

package net.learn2develop.UIActivity;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
Toast.makeText(getBaseContext(),
“Center was clicked”,
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
Toast.makeText(getBaseContext(),
“Left arrow was clicked”,
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
Toast.makeText(getBaseContext(),
“Right arrow was clicked”,
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_UP:
Toast.makeText(getBaseContext(),
“Up arrow was clicked”,
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
Toast.makeText(getBaseContext(),
“Down arrow was clicked”,
Toast.LENGTH_LONG).show();
break;
}
return false;
}
}

4.برنامه را اجرا کنید.

5.وقتی اکتیویتی بارگذاری گردید,چیزی در EditText بنویسید.سپس روی فلش پاین در پد جهت ها کلیک کنید.پیامی نمایش داده می شود.

روش کار

وقتی اکتیویتی شروع به کار کند,cursor در حالت چشمک زن در EditText قرار دارد,چون بر روی این view فوکوس شده است.در کلاس MainActivity متد ()onKeyDown از کلاس پایه Activity را پیاده سازی کنید:

 

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
//...
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
//...
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
//...
break;
case KeyEvent.KEYCODE_DPAD_UP:
//...
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
//...
break;
}
return false;

در اندروید,وقتی کلید فشرده می شود,view یی که در حالت فوکوس قرار دارد,سعی می کند تا این رویداد را خود کنترل یا به اصطلاح Handle کند.در مثال فوق وقتی که EditText فوکوس شده است و شما چیزی را نوشتید,این view رویداد اتفاق افتاده را کنترل کرده و متنی که شما وارد کردید را نمایش می دهد.حال اگر کلیدهای فلش بالا یا پایین را بزنید,دیگر EditText آن را کنترل نمی کند و این رویداد به اکتیویتی سپرده می شود.در این مورد,متد ()onKeyDown فراخوانی می گردد.در این مثال کلید فشرده شده شناسایی و با توجه به آن,پیامی نمایش داده شد.البته به این نکته هم توجه داشته باشید که حالا دکمه OK که view بعدی است,فوکوس شده,چون فلش پایین به معنای انتخاب view بعدی است.جالب است بدانید وقتی که درون EditText متنی موجود باشد و cursor در پایان متن باشد,فشردن فلش سمت چپ,متد()inKeyDown را فراخوانی نخواهد کرد.چرا که این دکمه,cursor را یک کاراکتر به سمت چپ می برد و دلیل آن این است که خود EditText این رویداد را کنترل می کند.اما اگر در انتهای متن باشید و فلش سمت راست را بزنید آن زمان متد()onKeyDown فراخوانی خواهد شد.چون دیگر در سمت راست متنی وجود ندارد تا EditText با کنترل این رویداد روی آن عملیاتی انجام دهد.اما وقتی cursor در ابتدای متن باشد.خود view این رویداد را کنترل می کند.حالا اگر فلش چپ را بزنید متد ()onKeyDown فراخوانی خواهد شد چون در سمت چپ متنی وجود ندارد.

وقتی که دکمه ی OK فوکوس شده باشد, دکمه ی وسط پنل جهات را فشار دهید.توجه کنید که پیام Center was clicked نمایش داده نشد.و دلیل آن هم این است که خود دکمه این رویداد را کنترل می کند.بنابراین این رویداد متد()onKeyDown را فراخوانی نخواهد کرد.همچنین توجه کنید که متد ()onKeyDown یک مقدار از نوع Boolean را به عنوان نتیجه بر میگرداند.برای اینکه سسیستم وقت بیشتری را برای پردازش رویداد نگذارد,باید مقدار true را برگردانیم.برای نمونه به مثال زیر توجه کنید که پس از انجام کار مقدار true را بر میگردانیم:

 

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
Toast.makeText(getBaseContext(),
“Center was clicked”,
Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_DPAD_LEFT:
Toast.makeText(getBaseContext(),
“Left arrow was clicked”,
Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT:
Toast.makeText(getBaseContext(),
“Right arrow was clicked”,
Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_DPAD_UP:
Toast.makeText(getBaseContext(),
“Up arrow was clicked”,
Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_DPAD_DOWN:
Toast.makeText(getBaseContext(),
“Down arrow was clicked”,
Toast.LENGTH_LONG).show();
return true;
}
return false;
}

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

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه