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 ให้เปิดไฟล์กิจกรรมของโครงการแล้วคลิก

ไอคอนเรียกใช้จากแถบเครื่องมือ Android Studio ติดตั้งแอปบน AVD ของคุณและเริ่มการทำงานและหากทุกอย่างเรียบร้อยดีกับการตั้งค่าและแอปพลิเคชันของคุณแอปจะแสดงหน้าต่าง Emulator ตามมา -

ตอนนี้คุณลองคลิกที่ปุ่มสองปุ่มทีละปุ่มและคุณจะเห็นแบบอักษรของไฟล์ Hello World ข้อความจะเปลี่ยนไปซึ่งเกิดขึ้นเนื่องจากมีการเรียกวิธีการจัดการเหตุการณ์คลิกที่ลงทะเบียนไว้กับเหตุการณ์การคลิก

ออกกำลังกาย

ฉันจะแนะนำให้ลองเขียนตัวจัดการเหตุการณ์ที่แตกต่างกันสำหรับประเภทเหตุการณ์ที่แตกต่างกันและทำความเข้าใจความแตกต่างที่แน่นอนในประเภทเหตุการณ์และการจัดการที่แตกต่างกัน เหตุการณ์ที่เกี่ยวข้องกับวิดเจ็ตเมนูสปินเนอร์ตัวเลือกมีความแตกต่างกันเล็กน้อย แต่ก็เป็นไปตามแนวคิดเดียวกันกับที่อธิบายไว้ข้างต้น