پنجره اطلاعات، نوشتار یا تصاویر را در پنجره بالاپر بالای نقشه نمایش میدهد. پنجرههای اطلاعات همیشه به یک نشانگر متصل هستند. رفتار پیشفرض آنها این است که وقتی روی نشانگر تکضرب زده میشود نمایش داده شوند.
نمونههای کد
مخزن ApiDemos در GitHub شامل نمونهای است که همه ویژگیهای پنجره اطلاعات را نشان میدهد:
- MarkerDemoActivity - Java: سفارشیسازی پنجرههای اطلاعات و استفاده از شنوندگان پنجره اطلاعات
- MarkerDemoActivity - Kotlin: سفارشیسازی پنجرههای اطلاعات و استفاده از شنوندگان پنجره اطلاعات
مقدمه
پنجره اطلاعات به شما امکان میدهد وقتی کاربر روی نشانگر تکضرب میزند، اطلاعاتی را به او نمایش دهید. در هر بار فقط یک پنجره اطلاعات نمایش داده میشود. اگر کاربر روی نشانگری کلیک کند، پنجره اطلاعات فعلی بسته میشود و پنجره اطلاعات جدید نمایش داده میشود. توجه داشته باشید که اگر کاربر روی نشانیای کلیک کند که درحالحاضر پنجره اطلاعات را نشان میدهد، آن پنجره اطلاعات بسته و دوباره باز میشود.
پنجره اطلاعات بهصورت جهتدار دربرابر صفحهنمایش دستگاه رسم میشود و در بالای نشانگر مرتبط با آن در مرکز قرار میگیرد. پنجره اطلاعات پیشفرض حاوی عنوان پررنگ، با گزیده نوشتار (اختیاری) در زیر عنوان است.
افزودن پنجره اطلاعات
سادهترین روش برای افزودن پنجره اطلاعات، تنظیم روشهای title() و snippet() نشانگر مربوطه است. تنظیم این داراییها باعث میشود هرگاه روی آن نشانگر کلیک شود، پنجره اطلاعاتی ظاهر شود.
Kotlin
val melbourneLatLng = LatLng(-37.81319, 144.96298) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLatLng) .title("Melbourne") .snippet("Population: 4,137,400") )
جاوا
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() }
جاوا
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() را با پیادهسازی خودتان فراخوانی کنید. این میانای کاربری شامل دو روش برای پیادهسازی است:
getInfoWindow(Marker) و getInfoContents(Marker). این
API ابتدا getInfoWindow(Marker) را فراخوانی میکند و اگر null
برگردانده شود، سپس getInfoContents(Marker) را فراخوانی میکند. اگر این مورد هم
null را برگرداند، از پنجره اطلاعات پیشفرض استفاده خواهد شد.
اولی (getInfoWindow()) به شما امکان میدهد نمایی ارائه دهید که
برای کل پنجره اطلاعات استفاده خواهد شد. دومی از این موارد
(getInfoContents()) به شما امکان میدهد فقط محتویات پنجره را سفارشیسازی کنید
اما همچنان قاب و پسزمینه پنجره اطلاعات پیشفرض را حفظ کنید.
تصاویر زیر یک پنجره اطلاعات پیشفرض، یک پنجره اطلاعات با محتوای سفارشیشده، و یک پنجره اطلاعات با قاب و پسزمینه سفارشیشده را نشان میدهند.
رویدادهای پنجره اطلاعات
نمونه MarkerDemoActivity شامل کد نمونه برای ثبت و مدیریت رویدادهای پنجره اطلاعات است.
میتوانید از OnInfoWindowClickListener برای گوش دادن به رویدادهای کلیک در پنجره اطلاعات استفاده کنید. برای تنظیم این شنونده در نقشه،
با GoogleMap.setOnInfoWindowClickListener(OnInfoWindowClickListener) تماس بگیرید. وقتی
کاربری روی پنجره اطلاعات کلیک میکند، onInfoWindowClick(Marker) فراخوانده میشود
و پنجره اطلاعات با رنگ برجسته پیشفرض (خاکستری) برجسته میشود.
Kotlin
map.setOnInfoWindowClickListener { marker -> Toast.makeText( context, "Info window clicked", Toast.LENGTH_SHORT ).show() }
جاوا
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) تنظیم کنید.
این شنونده عملکردی مشابه شنونده کلیک دارد و در رویدادهای کلیک طولانی با یک onInfoWindowClose(Marker) پاسخگویی مطلع خواهد شد.
برای دریافت اعلان هنگام بسته شدن پنجره اطلاعات، از
OnInfoWindowCloseListener استفاده کنید که میتوانید آن را با فراخوانی
GoogleMap.setOnInfoWindowCloseListener(OnInfoWindowCloseListener) تنظیم کنید. onInfoWindowClose(Marker) پاسخ تماس دریافت خواهید کرد.
نکته درباره بازآوری پنجره اطلاعات: اگر کاربر با تکضرب زدن روی نشانگری که ازقبل پنجره اطلاعات باز دارد پنجره اطلاعات را بازآوری کند، رویداد onInfoWindowClose() فعال میشود. اما اگر بهصورت برنامهنویسی Marker.showInfoWindow() را در یک پنجره اطلاعات باز فراخوانی کنید، رویداد onInfoWindowClose() اجرا نمیشود. عملکرد دوم براساس این فرض است که شما میدانید پنجره اطلاعات بسته و دوباره باز خواهد شد.
همانطور که در بخش قبلی درباره پنجرههای اطلاعات ذکر شد، پنجره اطلاعات یک نمای زنده نیست. درعوض، نما بهصورت تصویر روی نقشه ارائه میشود. درنتیجه، هر شنوندهای که روی نما تنظیم میکنید نادیده گرفته میشود و نمیتوانید بین رویدادهای کلیک روی بخشهای مختلف نما تمایز قائل شوید. توصیه میشود عناصر تعاملی — مانند دکمهها، چارگوشهای انتخاب، یا ورودیهای نوشتاری — را در پنجره اطلاعات سفارشی خود قرار ندهید.