หน้าต่างข้อมูลจะแสดงข้อความหรือรูปภาพในหน้าต่างป๊อปอัปเหนือแผนที่ หน้าต่างข้อมูลจะยึดกับเครื่องหมายเสมอ ลักษณะการทำงานเริ่มต้นคือจะแสดงเมื่อมีการแตะตัวทำเครื่องหมาย
ตัวอย่างโค้ด
ที่เก็บ ApiDemos บน GitHub มี ตัวอย่างที่แสดงฟีเจอร์ทั้งหมดของหน้าต่างข้อมูล ดังนี้
- MarkerDemoActivity - Java: การปรับแต่งหน้าต่างข้อมูลและการใช้ Listener ของหน้าต่างข้อมูล
- MarkerDemoActivity - Kotlin: การปรับแต่งหน้าต่างข้อมูลและ การใช้ Listener ของหน้าต่างข้อมูล
บทนำ
หน้าต่างข้อมูลช่วยให้คุณแสดงข้อมูลแก่ผู้ใช้เมื่อแตะเครื่องหมาย โดยจะแสดงหน้าต่างข้อมูลเพียงครั้งละ 1 หน้าต่าง หากผู้ใช้คลิกเครื่องหมาย หน้าต่างข้อมูลปัจจุบันจะปิดลงและหน้าต่างข้อมูลใหม่จะแสดงขึ้น โปรดทราบว่าหากผู้ใช้คลิกเครื่องหมายที่กำลังแสดงหน้าต่างข้อมูลอยู่ หน้าต่างข้อมูลนั้นจะปิดลงและเปิดขึ้นอีกครั้ง
หน้าต่างข้อมูลจะวาดโดยหันไปทางหน้าจอของอุปกรณ์และอยู่กึ่งกลางเหนือเครื่องหมายที่เชื่อมโยง หน้าต่างข้อมูลเริ่มต้นจะมีชื่อเป็นตัวหนาและมีข้อความ Snippet (ไม่บังคับ) อยู่ใต้ชื่อ
เพิ่มหน้าต่างข้อมูล
วิธีที่ง่ายที่สุดในการเพิ่มหน้าต่างข้อมูลคือการตั้งค่าเมธอด title() และ snippet() ของเครื่องหมายที่เกี่ยวข้อง การตั้งค่าพร็อพเพอร์ตี้เหล่านี้จะทำให้หน้าต่างข้อมูลปรากฏขึ้นเมื่อใดก็ตามที่มีการคลิกเครื่องหมายนั้น
Kotlin
val melbourneLatLng = LatLng(-37.81319, 144.96298) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLatLng) .title("Melbourne") .snippet("Population: 4,137,400") )
Java
final LatLng melbourneLatLng = new LatLng(-37.81319, 144.96298); Marker melbourne = map.addMarker( new MarkerOptions() .position(melbourneLatLng) .title("Melbourne") .snippet("Population: 4,137,400"));
แสดง/ซ่อนหน้าต่างข้อมูล
หน้าต่างข้อมูลออกแบบมาเพื่อตอบสนองต่อการโต้ตอบแบบสัมผัสของผู้ใช้ หากต้องการ คุณ
สามารถแสดงหน้าต่างข้อมูลแบบเป็นโปรแกรมได้โดยเรียกใช้
showInfoWindow()
ในเครื่องหมายเป้าหมาย และซ่อนหน้าต่างข้อมูลได้โดยเรียกใช้
hideInfoWindow()
Kotlin
val melbourneLatLng = LatLng(-37.81319, 144.96298) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLatLng) .title("Melbourne") ) melbourne?.showInfoWindow() if (melbourne?.isInfoWindowShown == true) { melbourne.hideInfoWindow() }
Java
final LatLng melbourneLatLng = new LatLng(-37.81319, 144.96298); Marker melbourne = map.addMarker( new MarkerOptions() .position(melbourneLatLng) .title("Melbourne")); melbourne.showInfoWindow(); if (melbourne.isInfoWindowShown()) { melbourne.hideInfoWindow(); }
นอกจากนี้ คุณยังสร้างหน้าต่างข้อมูลสำหรับเครื่องหมายที่จัดกลุ่มแต่ละรายการได้ด้วย อ่านคำแนะนำในการเพิ่มหน้าต่างข้อมูลสำหรับเครื่องหมายที่จัดกลุ่มแต่ละรายการ
หน้าต่างข้อมูลที่กำหนดเอง
คุณยังปรับแต่งเนื้อหาและการออกแบบหน้าต่างข้อมูลได้ด้วย โดยต้องสร้างการใช้งานจริงของ
อินเทอร์เฟซ
InfoWindowAdapter แล้วเรียกใช้
GoogleMap.setInfoWindowAdapter() ด้วย
การใช้งานของคุณ อินเทอร์เฟซนี้มี 2 เมธอดให้คุณใช้งาน ได้แก่:
getInfoWindow(Marker) และ getInfoContents(Marker) API จะเรียกใช้ getInfoWindow(Marker) ก่อน และหากระบบส่งคืน null ก็จะเรียกใช้ getInfoContents(Marker) หากเมธอดนี้ส่งคืน null ด้วย ระบบจะใช้หน้าต่างข้อมูลเริ่มต้น
เมธอดแรก (getInfoWindow()) ช่วยให้คุณระบุมุมมองที่จะใช้สำหรับหน้าต่างข้อมูลทั้งหมดได้
ส่วนเมธอดที่ 2
(getInfoContents()) ช่วยให้คุณปรับแต่งเนื้อหาของหน้าต่างได้
แต่ยังคงกรอบและพื้นหลังของหน้าต่างข้อมูลเริ่มต้นไว้
รูปภาพด้านล่างแสดงหน้าต่างข้อมูลเริ่มต้น หน้าต่างข้อมูลที่มีเนื้อหาที่กำหนดเอง และหน้าต่างข้อมูลที่มีกรอบและพื้นหลังที่กำหนดเอง
เหตุการณ์ของหน้าต่างข้อมูล
ตัวอย่าง MarkerDemoActivity มีโค้ดตัวอย่างสำหรับการ ลงทะเบียนและการจัดการเหตุการณ์ของหน้าต่างข้อมูล
คุณสามารถใช้ OnInfoWindowClickListener เพื่อ รอกิจกรรมกิจกรรมการคลิกในหน้าต่างข้อมูล หากต้องการตั้งค่า Listener นี้ในแผนที่
ให้เรียกใช้ GoogleMap.setOnInfoWindowClickListener(OnInfoWindowClickListener) เมื่อผู้ใช้คลิกหน้าต่างข้อมูล ระบบจะเรียกใช้ onInfoWindowClick(Marker) และไฮไลต์หน้าต่างข้อมูลด้วยสีไฮไลต์เริ่มต้น (สีเทา)
Kotlin
map.setOnInfoWindowClickListener { marker -> Toast.makeText( context, "Info window clicked", Toast.LENGTH_SHORT ).show() }
Java
map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker marker) { Toast.makeText(context, "Info window clicked", Toast.LENGTH_SHORT).show(); } });
ในทำนองเดียวกัน คุณสามารถรอกิจกรรมการคลิกแบบยาวได้ด้วย
OnInfoWindowLongClickListener ซึ่งคุณ
ตั้งค่าได้โดยเรียกใช้
GoogleMap.setOnInfoWindowCloseListener(OnInfoWindowCloseListener)
Listener นี้จะทำงานคล้ายกับ Listener การคลิกและจะได้รับการแจ้งเตือนเกี่ยวกับ
เหตุการณ์การคลิกแบบยาวด้วยการเรียกกลับ onInfoWindowClose(Marker)
หากต้องการรับการแจ้งเตือนเมื่อหน้าต่างข้อมูลปิดลง ให้ใช้
OnInfoWindowCloseListener ซึ่งคุณสามารถ
ตั้งค่าได้โดยเรียกใช้
GoogleMap.setOnInfoWindowCloseListener(OnInfoWindowCloseListener) คุณจะได้รับ
การเรียกกลับ onInfoWindowClose(Marker)
หมายเหตุเกี่ยวกับการรีเฟรชหน้าต่างข้อมูล: เหตุการณ์ onInfoWindowClose() จะทริกเกอร์ขึ้นหาก
ผู้ใช้รีเฟรชหน้าต่างข้อมูลโดยแตะเครื่องหมายที่มีหน้าต่างข้อมูลเปิดอยู่แล้ว
แต่หากคุณเรียกใช้ Marker.showInfoWindow() แบบเป็นโปรแกรมใน
หน้าต่างข้อมูลที่เปิดอยู่ เหตุการณ์ onInfoWindowClose() จะไม่ทริกเกอร์ขึ้น ลักษณะการทำงานอย่างหลังนี้อิงตามสมมติฐานว่าคุณทราบว่าหน้าต่างข้อมูลจะปิดลงและเปิดขึ้นอีกครั้ง
ดังที่กล่าวไว้ในส่วนก่อนหน้าเกี่ยวกับหน้าต่างข้อมูล หน้าต่างข้อมูลไม่ใช่มุมมองแบบสด แต่ระบบจะแสดงมุมมองเป็นรูปภาพบนแผนที่ ด้วยเหตุนี้ ระบบจึงไม่สนใจ Listener ที่คุณตั้งค่าไว้ในมุมมอง และคุณจึงแยกความแตกต่างระหว่างกิจกรรมการคลิกในส่วนต่างๆ ของมุมมองไม่ได้ เราขอแนะนำไม่ให้วางคอมโพเนนต์แบบอินเทอร์แอกทีฟ เช่น ปุ่ม ช่องทำเครื่องหมาย หรือช่องป้อนข้อความ ไว้ในหน้าต่างข้อมูลที่กำหนดเอง