หน้าต่างข้อมูล

เลือกแพลตฟอร์ม: Android iOS JavaScript

หน้าต่างข้อมูลจะแสดงข้อความหรือรูปภาพในหน้าต่างป๊อปอัปที่อยู่เหนือแผนที่ หน้าต่างข้อมูลจะตรึงอยู่ที่เครื่องหมายเสมอ พฤติกรรมเริ่มต้นคือ แสดงเมื่อมีการแตะเครื่องหมาย

ตัวอย่างโค้ด

ที่เก็บ ApiDemos ใน GitHub มีตัวอย่างที่สาธิตฟีเจอร์หน้าต่างข้อมูลทั้งหมด ดังนี้

  • MarkerDemoActivity - Java: การปรับแต่งหน้าต่างข้อมูลและการใช้ Listener หน้าต่างข้อมูล
  • MarkerDemoActivity - Kotlin: การปรับแต่งหน้าต่างข้อมูลและการใช้ Listener ของหน้าต่างข้อมูล

เกริ่นนำ

หน้าต่างข้อมูลช่วยให้คุณสามารถแสดงข้อมูลให้กับผู้ใช้เมื่อผู้ใช้แตะเครื่องหมาย หน้าต่างข้อมูลจะแสดงได้ครั้งละหนึ่งหน้าต่างเท่านั้น หากผู้ใช้คลิกที่เครื่องหมาย หน้าต่างข้อมูลปัจจุบันจะปิดลงและหน้าต่างข้อมูลใหม่จะปรากฏขึ้น โปรดทราบว่าถ้าผู้ใช้คลิกเครื่องหมายที่แสดงหน้าต่างข้อมูล หน้าต่างข้อมูลนั้นจะปิดและเปิดขึ้นมาใหม่

หน้าต่างข้อมูลจะวาดอยู่ข้างหน้าจอของอุปกรณ์ตรงกึ่งกลางเหนือตัวทำเครื่องหมายที่เกี่ยวข้อง หน้าต่างข้อมูลเริ่มต้นจะมีชื่อเป็นตัวหนา พร้อมด้วยข้อความตัวอย่าง (ไม่บังคับ) ใต้ชื่อ

เพิ่มหน้าต่างข้อมูล

วิธีที่ง่ายที่สุดในการเพิ่มหน้าต่างข้อมูลคือการตั้งค่าเมธอด 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()

      

Java


final LatLng melbourneLatLng = new LatLng(-37.81319, 144.96298);
Marker melbourne = map.addMarker(
    new MarkerOptions()
        .position(melbourneLatLng)
        .title("Melbourne"));
melbourne.showInfoWindow();

      

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

หน้าต่างข้อมูลที่กำหนดเอง

นอกจากนี้ คุณยังสามารถกำหนดค่าเนื้อหาและการออกแบบของหน้าต่างข้อมูลได้ด้วย โดยคุณจะต้องสร้างการติดตั้งใช้งานอินเทอร์เฟซ 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



internal inner class InfoWindowActivity : AppCompatActivity(),
    OnInfoWindowClickListener,
    OnMapReadyCallback {
    override fun onMapReady(googleMap: GoogleMap) {
        // Add markers to the map and do other map setup.
        // ...
        // Set a listener for info window events.
        googleMap.setOnInfoWindowClickListener(this)
    }

    override fun onInfoWindowClick(marker: Marker) {
        Toast.makeText(
            this, "Info window clicked",
            Toast.LENGTH_SHORT
        ).show()
    }
}

      

Java


class InfoWindowActivity extends AppCompatActivity implements
    GoogleMap.OnInfoWindowClickListener,
    OnMapReadyCallback {

    @Override
    public void onMapReady(GoogleMap googleMap) {
        // Add markers to the map and do other map setup.
        // ...
        // Set a listener for info window events.
        googleMap.setOnInfoWindowClickListener(this);
    }

    @Override
    public void onInfoWindowClick(Marker marker) {
        Toast.makeText(this, "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 ที่คุณตั้งค่าไว้ในการแสดงผล และคุณไม่สามารถแยกความแตกต่างระหว่างกิจกรรมการคลิกในส่วนต่างๆ ของมุมมองได้ ขอแนะนำว่าไม่ควรวางคอมโพเนนต์แบบอินเทอร์แอกทีฟ เช่น ปุ่ม ช่องทำเครื่องหมาย หรือการป้อนข้อความ ไว้ในหน้าต่างข้อมูลที่กำหนดเอง