Android - การจัดการเหตุการณ์
Events are a useful way to collect data about a user's interaction with interactive components of Applications.เช่นการกดปุ่มหรือการสัมผัสหน้าจอเป็นต้นเฟรมเวิร์กของ Android จะรักษาคิวเหตุการณ์ไว้เป็นแบบเข้าก่อนออกก่อน (FIFO) คุณสามารถบันทึกเหตุการณ์เหล่านี้ในโปรแกรมของคุณและดำเนินการที่เหมาะสมตามข้อกำหนด
มีแนวคิดสามประการที่เกี่ยวข้องกับการจัดการเหตุการณ์ของ Android -
Event Listeners- ตัวฟังเหตุการณ์คืออินเทอร์เฟซในคลาส View ที่มีวิธีการโทรกลับเดียว เมธอดเหล่านี้จะเรียกใช้โดยเฟรมเวิร์ก Android เมื่อมุมมองที่ผู้ฟังได้รับการลงทะเบียนถูกทริกเกอร์โดยการโต้ตอบของผู้ใช้กับรายการใน UI
Event Listeners Registration - การลงทะเบียนเหตุการณ์คือกระบวนการที่ตัวจัดการเหตุการณ์ได้รับการลงทะเบียนกับผู้ฟังเหตุการณ์เพื่อให้ตัวจัดการถูกเรียกเมื่อผู้ฟังเหตุการณ์เริ่มการทำงานของเหตุการณ์
Event Handlers - เมื่อมีเหตุการณ์เกิดขึ้นและเราได้ลงทะเบียนผู้ฟังเหตุการณ์สำหรับเหตุการณ์แล้วผู้ฟังเหตุการณ์จะเรียกตัวจัดการเหตุการณ์ซึ่งเป็นวิธีการที่จัดการเหตุการณ์จริง
ผู้ฟังเหตุการณ์และตัวจัดการเหตุการณ์
จัดการเหตุการณ์ | ผู้ฟังเหตุการณ์และคำอธิบาย |
---|---|
เมื่อคลิก() | OnClickListener() สิ่งนี้เรียกว่าเมื่อผู้ใช้คลิกหรือสัมผัสหรือโฟกัสไปที่วิดเจ็ตใด ๆ เช่นปุ่มข้อความรูปภาพ ฯลฯ คุณจะใช้ตัวจัดการเหตุการณ์ onClick () เพื่อจัดการเหตุการณ์ดังกล่าว |
onLongClick () | OnLongClickListener() สิ่งนี้เรียกว่าเมื่อผู้ใช้คลิกหรือสัมผัสหรือมุ่งเน้นไปที่วิดเจ็ตใด ๆ เช่นปุ่มข้อความรูปภาพ ฯลฯ เป็นเวลาหนึ่งวินาทีหรือมากกว่านั้น คุณจะใช้ onLongClick () ตัวจัดการเหตุการณ์เพื่อจัดการเหตุการณ์ดังกล่าว |
onFocusChange () | OnFocusChangeListener() สิ่งนี้เรียกว่าเมื่อวิดเจ็ตสูญเสียโฟกัสเช่น ผู้ใช้ออกไปจากรายการดู คุณจะใช้ตัวจัดการเหตุการณ์ onFocusChange () เพื่อจัดการเหตุการณ์ดังกล่าว |
onKey () | OnFocusChangeListener() สิ่งนี้เรียกว่าเมื่อผู้ใช้จดจ่ออยู่กับรายการและกดหรือปล่อยคีย์ฮาร์ดแวร์บนอุปกรณ์ คุณจะใช้ onKey () ตัวจัดการเหตุการณ์เพื่อจัดการเหตุการณ์ดังกล่าว |
onTouch () | OnTouchListener() สิ่งนี้เรียกว่าเมื่อผู้ใช้กดปุ่มปล่อยปุ่มหรือท่าทางการเคลื่อนไหวใด ๆ บนหน้าจอ คุณจะใช้ onTouch () ตัวจัดการเหตุการณ์เพื่อจัดการเหตุการณ์ดังกล่าว |
onMenuItemClick () | OnMenuItemClickListener() สิ่งนี้เรียกว่าเมื่อผู้ใช้เลือกรายการเมนู คุณจะใช้ตัวจัดการเหตุการณ์ onMenuItemClick () เพื่อจัดการเหตุการณ์ดังกล่าว |
onCreateContextMenu () | onCreateContextMenuItemListener() สิ่งนี้ถูกเรียกเมื่อเมนูบริบทกำลังถูกสร้างขึ้น (อันเป็นผลมาจากการคลิกแบบยาว "อย่างต่อเนื่อง) |
มีผู้ฟังเหตุการณ์อีกมากมายที่เป็นส่วนหนึ่งของ Viewคลาสเช่น OnHoverListener, OnDragListener เป็นต้นซึ่งอาจจำเป็นสำหรับแอปพลิเคชันของคุณ ดังนั้นฉันขอแนะนำให้ดูเอกสารอย่างเป็นทางการสำหรับการพัฒนาแอปพลิเคชัน Android ในกรณีที่คุณกำลังจะพัฒนาแอปที่ซับซ้อน
การลงทะเบียนผู้ฟังเหตุการณ์
การลงทะเบียนเหตุการณ์คือกระบวนการที่ตัวจัดการเหตุการณ์ได้รับการลงทะเบียนกับผู้ฟังเหตุการณ์เพื่อให้ตัวจัดการถูกเรียกเมื่อ Listener เหตุการณ์เริ่มการทำงานของเหตุการณ์ แม้ว่าจะมีหลายวิธีที่ยุ่งยากในการลงทะเบียนผู้ฟังเหตุการณ์ของคุณสำหรับเหตุการณ์ใด ๆ แต่ฉันจะแสดงรายการเพียง 3 วิธียอดนิยมซึ่งคุณสามารถใช้วิธีใดก็ได้ตามสถานการณ์
การใช้คลาสภายในที่ไม่ระบุชื่อ
ชั้นเรียนกิจกรรมใช้อินเทอร์เฟซ Listener
การใช้ไฟล์ Layout activity_main.xml เพื่อระบุตัวจัดการเหตุการณ์โดยตรง
ส่วนด้านล่างนี้จะแสดงตัวอย่างโดยละเอียดเกี่ยวกับสถานการณ์ทั้งสาม -
โหมดสัมผัส
ผู้ใช้สามารถโต้ตอบกับอุปกรณ์ได้โดยใช้ปุ่มฮาร์ดแวร์หรือปุ่มหรือสัมผัสหน้าจอการสัมผัสหน้าจอจะทำให้อุปกรณ์เข้าสู่โหมดสัมผัส จากนั้นผู้ใช้สามารถโต้ตอบได้โดยแตะปุ่มเสมือนบนหน้าจอรูปภาพ ฯลฯ คุณสามารถตรวจสอบว่าอุปกรณ์อยู่ในโหมดสัมผัสหรือไม่โดยเรียกใช้เมธอด isInTouchMode () ของคลาส View
โฟกัส
มักจะไฮไลต์มุมมองหรือวิดเจ็ตหรือแสดงเคอร์เซอร์กะพริบเมื่ออยู่ในโฟกัส สิ่งนี้บ่งชี้ว่าพร้อมที่จะรับข้อมูลจากผู้ใช้
isFocusable() - ส่งคืนจริงหรือเท็จ
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 และจะมีประโยชน์หากแต่ละคลาสถูกนำไปใช้กับคอนโทรลเดี่ยวเท่านั้นและคุณมีข้อได้เปรียบในการส่งอาร์กิวเมนต์ไปยังตัวจัดการเหตุการณ์ ในวิธีการจัดการเหตุการณ์วิธีนี้สามารถเข้าถึงข้อมูลส่วนตัวของกิจกรรม ไม่จำเป็นต้องมีการอ้างอิงเพื่อโทรเข้าร่วมกิจกรรม
แต่ถ้าคุณใช้ตัวจัดการกับตัวควบคุมมากกว่าหนึ่งตัวคุณจะต้องตัดและวางโค้ดสำหรับตัวจัดการและหากโค้ดสำหรับตัวจัดการนั้นยาวก็จะทำให้โค้ดดูแลรักษายากขึ้น
ต่อไปนี้เป็นขั้นตอนง่ายๆเพื่อแสดงว่าเราจะใช้ประโยชน์จากคลาส Listener แยกกันเพื่อลงทะเบียนและบันทึกเหตุการณ์คลิกได้อย่างไร ในทำนองเดียวกันคุณสามารถใช้ Listener ของคุณสำหรับประเภทเหตุการณ์อื่น ๆ ที่จำเป็น
ขั้นตอน | คำอธิบาย |
---|---|
1 | คุณจะใช้ Android studio IDE เพื่อสร้างแอปพลิเคชัน Android และตั้งชื่อเป็นmyapplicationภายใต้แพ็คเกจcom.example.myapplicationตามที่อธิบายไว้ในบทตัวอย่าง Hello World |
2 | แก้ไขไฟล์src / MainActivity.javaเพื่อเพิ่มตัวฟังเหตุการณ์คลิกและตัวจัดการสำหรับสองปุ่มที่กำหนด |
3 | แก้ไขเนื้อหา detault ของไฟล์res / layout / activity_main.xmlเพื่อรวมการควบคุม Android UI |
4 | ไม่จำเป็นต้องประกาศค่าคงที่สตริงเริ่มต้นสตูดิโอ Android จะดูแลค่าคงที่เริ่มต้น |
5 | เรียกใช้แอปพลิเคชันเพื่อเปิดโปรแกรมจำลอง Android และตรวจสอบผลลัพธ์ของการเปลี่ยนแปลงที่ทำในแอปพลิเคชัน |
ต่อไปนี้เป็นเนื้อหาของไฟล์กิจกรรมหลักที่แก้ไข src/com.example.myapplication/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 ไฟล์ -
ที่นี่ abc ระบุเกี่ยวกับโลโก้ tutorialspoint
<?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/strings.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>
ลองเรียกใช้ไฟล์ myapplicationใบสมัคร ฉันถือว่าคุณได้สร้างไฟล์AVDในขณะที่ทำการตั้งค่าสภาพแวดล้อม ในการเรียกใช้แอปจาก Android Studio ให้เปิดไฟล์กิจกรรมของโครงการแล้วคลิก
ตอนนี้คุณลองคลิกที่ปุ่มสองปุ่มทีละปุ่มและคุณจะเห็นแบบอักษรของไฟล์ Hello World ข้อความจะเปลี่ยนไปซึ่งเกิดขึ้นเนื่องจากมีการเรียกวิธีการจัดการเหตุการณ์คลิกที่ลงทะเบียนไว้กับเหตุการณ์การคลิก
ออกกำลังกาย
ฉันจะแนะนำให้ลองเขียนตัวจัดการเหตุการณ์ที่แตกต่างกันสำหรับประเภทเหตุการณ์ที่แตกต่างกันและทำความเข้าใจความแตกต่างที่แน่นอนในประเภทเหตุการณ์และการจัดการที่แตกต่างกัน เหตุการณ์ที่เกี่ยวข้องกับวิดเจ็ตเมนูสปินเนอร์ตัวเลือกมีความแตกต่างกันเล็กน้อย แต่ก็เป็นไปตามแนวคิดเดียวกันกับที่อธิบายไว้ข้างต้น