تعرِض نافذة المعلومات نصًا أو صورًا في نافذة منبثقة فوق الخريطة. تكون نوافذ المعلومات مرتبطة دائمًا بعلامة. ويكون السلوك التلقائي هو العرض عند النقر على العلامة.
عيّنات تعليمات برمجية
يتضمّن مستودع 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") )
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()
لإطلاعه على
عملية التنفيذ. تحتوي الواجهة على طريقتَين يمكنك تنفيذهما:
getInfoWindow(Marker)
وgetInfoContents(Marker)
. ستستدعي واجهة برمجة التطبيقات أولاً getInfoWindow(Marker)
، وإذا تم عرض null
، ستستدعي getInfoContents(Marker)
. إذا تم عرض null
أيضًا، سيتم استخدام نافذة المعلومات التلقائية.
يتيح لك الخيار الأول (getInfoWindow()
) تقديم عرض
سيتم استخدامه في نافذة المعلومات بأكملها. يتيح لك الخيار الثاني
(getInfoContents()
) تخصيص محتوى النافذة فقط،
مع الاحتفاظ بإطار نافذة المعلومات والخلفية التلقائية.
تعرض الصور أدناه نافذة معلومات تلقائية ونافذة معلومات تتضمّن محتوًى مخصّصًا ونافذة معلومات تتضمّن إطارًا وخلفية مخصّصَين.
أحداث نافذة المعلومات
يتضمّن نموذج MarkerDemoActivity مثالاً على الرمز البرمجي لتسجيل أحداث نافذة المعلومات ومعالجتها.
يمكنك استخدام OnInfoWindowClickListener
لتلقّي أحداث النقر في نافذة معلومات. لضبط هذا المستمع على الخريطة،
اتصل على 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)
.
تعمل أداة معالجة هذا الحدث بالطريقة نفسها التي تعمل بها أداة معالجة النقرة، وسيتم إعلامها عند حدوث
أحداث النقرات الطويلة باستخدام دالة استدعاء onInfoWindowClose(Marker)
.
لتلقّي إشعار عند إغلاق نافذة المعلومات، استخدِم رمز OnInfoWindowCloseListener
الذي يمكنك ضبطه من خلال الاتصال بالرقم GoogleMap.setOnInfoWindowCloseListener(OnInfoWindowCloseListener)
. ستصلك مكالمة من فريق onInfoWindowClose(Marker)
.
ملاحظة حول إعادة تحميل نافذة معلومات: يتم تنشيط الحدث onInfoWindowClose()
إذا كان
المستخدم يُعيد تحميل نافذة معلومات من خلال النقر على علامة تتضمّن
نافذة معلومات مفتوحة. ولكن إذا طلبت Marker.showInfoWindow()
آليًا في
نافذة معلومات مفتوحة، لن يتم تشغيل الحدث onInfoWindowClose()
. يستند السلوك الأخير
إلى افتراض أنّك على دراية بأنّه سيتم
إغلاق نافذة المعلومات وإعادة فتحها.
كما ذكرنا في القسم السابق عن نوافذ المعلومات، لا تُعدّ نافذة المعلومات عرضًا مباشرًا. بدلاً من ذلك، يتم عرض العرض كصورة على الخريطة. نتيجةً لذلك، يتم تجاهل أيّ أدوات معالجة أحداث تحدّدها في العرض ولا يمكنك التمييز بين أحداث النقرات في أجزاء مختلفة من العرض. ننصحك بعدم وضع مكونات تفاعلية، مثل الأزرار أو مربّعات الاختيار أو إدخالات النص، في نافذة المعلومات المخصّصة.